From 8fed1fe792cb6a5fc846901cd0de5ff36549cf85 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 26 Feb 2020 17:33:49 -0800 Subject: [PATCH] perf(core): adding micro benchmark for host bindings (#35705) This commit adds micro benchmark for host bindings, so that we can assess the impact of changes related to host bindings (for example PR #35568). PR Close #35705 --- packages/core/test/render3/perf/BUILD.bazel | 13 +++ .../test/render3/perf/host_binding/index.ts | 84 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 packages/core/test/render3/perf/host_binding/index.ts diff --git a/packages/core/test/render3/perf/BUILD.bazel b/packages/core/test/render3/perf/BUILD.bazel index a580272711..489907540b 100644 --- a/packages/core/test/render3/perf/BUILD.bazel +++ b/packages/core/test/render3/perf/BUILD.bazel @@ -216,3 +216,16 @@ ng_benchmark( name = "duplicate_map_based_style_and_class_bindings", bundle = ":duplicate_map_based_style_and_class_bindings_lib", ) + +ng_rollup_bundle( + name = "host_binding_lib", + entry_point = ":host_binding/index.ts", + deps = [ + ":perf_lib", + ], +) + +ng_benchmark( + name = "host_binding", + bundle = ":host_binding", +) diff --git a/packages/core/test/render3/perf/host_binding/index.ts b/packages/core/test/render3/perf/host_binding/index.ts new file mode 100644 index 0000000000..2c8aab26ca --- /dev/null +++ b/packages/core/test/render3/perf/host_binding/index.ts @@ -0,0 +1,84 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import {ɵɵdefineDirective, ɵɵelement, ɵɵhostProperty, ɵɵlistener} from '../../../../src/render3/index'; +import {DirectiveDefList, RenderFlags} from '../../../../src/render3/interfaces/definition'; +import {TAttributes} from '../../../../src/render3/interfaces/node'; +import {createBenchmark} from '../micro_bench'; +import {setupTestHarness} from '../setup'; + +` + @Directive({ + selector: '[hostBindingDir]' + }) + export class HostBindingDir { + exp = 'string-exp'; + + @HostBinding('data-a') + a: string = 'exp'; + + @HostListener('click') + onClick(event: any): void {} + } +`; +class HostBindingDir { + static ɵfac() { return new HostBindingDir(); } + static ɵdir = ɵɵdefineDirective({ + type: HostBindingDir, + selectors: [['', 'hostBindingDir', '']], + hostVars: 2, + hostBindings: function(rf: RenderFlags, ctx: any) { + if (rf & 1) { + ɵɵlistener('click', function() { return ctx.onClick(); }); + } + if (rf & 2) { + ɵɵhostProperty('data-a', ctx.exp); + } + } + }); + + exp = 'string-exp'; + onClick() {} +} + +` +
+`; +function componentTemplateFn(rf: RenderFlags, ctx: any) { + if (rf & 1) { + ɵɵelement(0, 'div', 0); + } +} + +const context: any = {}; +const consts: TAttributes[] = [['hostBindingDir', '']]; +const directives: DirectiveDefList = [HostBindingDir.ɵdir]; +const harness = setupTestHarness(componentTemplateFn, 1, 0, 1000, context, consts, directives); + +// Benchmark host bindings execution in *creation* mode +const createModeBenchmark = createBenchmark('host bindings'); +const createModeProfile = createModeBenchmark('`create` mode'); + +console.profile(createModeBenchmark.name + ':' + createModeProfile.name); +while (createModeProfile()) { + harness.createEmbeddedLView(); +} +console.profileEnd(); + +createModeBenchmark.report(); + +// Benchmark host bindings execution in *update* mode +const updateModeBenchmark = createBenchmark('host bindings'); +const updateModeProfile = updateModeBenchmark('`update` mode'); + +console.profile(updateModeBenchmark.name + ':' + updateModeProfile.name); +while (updateModeProfile()) { + harness.detectChanges(); +} +console.profileEnd(); + +updateModeBenchmark.report(); \ No newline at end of file