diff --git a/BUILD.bazel b/BUILD.bazel index b255a31acd..768c6c2ebc 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -5,6 +5,7 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "node_modules_filegroup") exports_files([ "tsconfig.json", "LICENSE", + "protractor-perf.conf.js", ]) # Developers should always run `bazel run :install` diff --git a/modules/benchmarks/BUILD.bazel b/modules/benchmarks/BUILD.bazel new file mode 100644 index 0000000000..8ef1f366db --- /dev/null +++ b/modules/benchmarks/BUILD.bazel @@ -0,0 +1,8 @@ +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "favicon", + srcs = [ + "favicon.ico", + ], +) diff --git a/modules/benchmarks/src/BUILD.bazel b/modules/benchmarks/src/BUILD.bazel index 5391f3c59d..45901bd2fa 100644 --- a/modules/benchmarks/src/BUILD.bazel +++ b/modules/benchmarks/src/BUILD.bazel @@ -12,3 +12,14 @@ ts_library( "//packages/core", ], ) + +ts_library( + name = "bootstrap", + srcs = [ + "bootstrap_ng2.ts", + "bootstrap_plain.ts", + ], + deps = [ + "//packages:types", + ], +) diff --git a/modules/benchmarks/src/README.md b/modules/benchmarks/src/README.md new file mode 100644 index 0000000000..9bd77a618f --- /dev/null +++ b/modules/benchmarks/src/README.md @@ -0,0 +1,7 @@ +# Benchmark Directory Layout + +## Bazel + +Under bazel the rules for laying out test files are slightly different. Use `largetable/render3` as an example. + +Put the perf file in current subdirectory (ie `largetable`) such that the same perf file can be used for each of the sub-subdirectories. (ie `largetable/*` should all be testable with the same perf file `largetable/largetable_perf.spec.ts`). Under bazel, typescript protractor spec files must end with `.spec.ts` or `.test.ts`. diff --git a/modules/benchmarks/src/largetable/BUILD.bazel b/modules/benchmarks/src/largetable/BUILD.bazel index 77f2cb24bd..8a6e269adb 100644 --- a/modules/benchmarks/src/largetable/BUILD.bazel +++ b/modules/benchmarks/src/largetable/BUILD.bazel @@ -13,3 +13,15 @@ ts_library( "//packages/core", ], ) + +ts_library( + name = "perf_lib", + testonly = 1, + srcs = [ + "largetable_perf.spec.ts", + ], + deps = [ + "//modules/e2e_util:lib", + "//packages:types", + ], +) diff --git a/modules/benchmarks/src/largetable/largetable_perf.spec.ts b/modules/benchmarks/src/largetable/largetable_perf.spec.ts new file mode 100644 index 0000000000..90d08cc24f --- /dev/null +++ b/modules/benchmarks/src/largetable/largetable_perf.spec.ts @@ -0,0 +1,66 @@ +/** + * @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 {$} from 'protractor'; + +import {runBenchmark, verifyNoBrowserErrors} from '../../../e2e_util/perf_util'; + +interface Worker { + id: string; + prepare?(): void; + work(): void; +} + +const CreateOnlyWorker: Worker = { + id: 'createOnly', + prepare: () => $('#destroyDom').click(), + work: () => $('#createDom').click() +}; + +const CreateAndDestroyWorker: Worker = { + id: 'createDestroy', + work: () => { + $('#createDom').click(); + $('#destroyDom').click(); + } +}; + +const UpdateWorker: Worker = { + id: 'update', + work: () => $('#createDom').click() +}; + +describe('largetable benchmark perf', () => { + + afterEach(verifyNoBrowserErrors); + + [CreateOnlyWorker, CreateAndDestroyWorker, UpdateWorker].forEach((worker) => { + describe(worker.id, () => { + it('should run for render3', (done) => { + runTableBenchmark({ + id: `largeTable.render3.${worker.id}`, + url: 'index.html', + ignoreBrowserSynchronization: true, + worker: worker + }).then(done, done.fail); + }); + }); + }); + + function runTableBenchmark( + config: {id: string, url: string, ignoreBrowserSynchronization?: boolean, worker: Worker}) { + return runBenchmark({ + id: config.id, + url: config.url, + ignoreBrowserSynchronization: config.ignoreBrowserSynchronization, + params: [{name: 'cols', value: 40}, {name: 'rows', value: 200}], + prepare: config.worker.prepare, + work: config.worker.work + }); + } +}); diff --git a/modules/benchmarks/src/largetable/render3/BUILD.bazel b/modules/benchmarks/src/largetable/render3/BUILD.bazel index 959c5afe35..4e5caf6770 100644 --- a/modules/benchmarks/src/largetable/render3/BUILD.bazel +++ b/modules/benchmarks/src/largetable/render3/BUILD.bazel @@ -1,18 +1,63 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "ng_module") +load("//tools:defaults.bzl", "ts_library") +load("//packages/bazel/src:ng_rollup_bundle.bzl", "ng_rollup_bundle") +load("//packages/bazel:index.bzl", "protractor_web_test") +load("@build_bazel_rules_typescript//:defs.bzl", "ts_devserver") -ng_module( +ts_library( name = "largetable_lib", srcs = glob( [ "**/*.ts", ], + exclude = ["protractor.on-prepare.ts"], ), deps = [ + "//modules/benchmarks/src:util_lib", "//modules/benchmarks/src/largetable:util_lib", "//packages:types", "//packages/core", "@rxjs", ], ) + +ng_rollup_bundle( + name = "bundle", + entry_point = "modules/benchmarks/src/largetable/render3/index.js", + deps = [ + ":largetable_lib", + ], +) + +genrule( + name = "favicon", + srcs = ["//modules/benchmarks:favicon"], + outs = ["favicon.ico"], + cmd = "cp $< $@", +) + +ts_devserver( + name = "devserver", + static_files = [ + ":bundle.min_debug.js", + ":bundle.min.js", + "index.html", + ":favicon", + ], +) + +protractor_web_test( + name = "perf", + configuration = "//:protractor-perf.conf.js", + data = [ + "//packages/bazel/src/protractor/utils", + "//packages/benchpress", + ], + on_prepare = ":protractor.on-prepare.js", + server = ":devserver", + tags = ["manual"], + deps = [ + "//modules/benchmarks/src/largetable:perf_lib", + ], +) diff --git a/modules/benchmarks/src/largetable/render3/index.html b/modules/benchmarks/src/largetable/render3/index.html index 75a5db817e..cd7538e7d0 100644 --- a/modules/benchmarks/src/largetable/render3/index.html +++ b/modules/benchmarks/src/largetable/render3/index.html @@ -1,13 +1,13 @@ +