feat(benchmarks): Add basic dart transformer benchmarks.
Adds simple benchmarks for various transformation phases, as well as hello_world. Does not integrate these into any benchmark frameworks yet.
This commit is contained in:
parent
457c15cd6c
commit
1864f60afb
|
@ -11,7 +11,7 @@ environment:
|
||||||
dependencies:
|
dependencies:
|
||||||
analyzer: '^0.24.4'
|
analyzer: '^0.24.4'
|
||||||
barback: '^0.15.2+2'
|
barback: '^0.15.2+2'
|
||||||
code_transformers: '^0.2.5'
|
code_transformers: '^0.2.8'
|
||||||
dart_style: '^0.1.3'
|
dart_style: '^0.1.3'
|
||||||
html: '^0.12.0'
|
html: '^0.12.0'
|
||||||
logging: '>=0.9.0 <0.11.0'
|
logging: '>=0.9.0 <0.11.0'
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
library angular2.test.benchmark.transform;
|
||||||
|
|
||||||
|
import 'package:guinness/guinness.dart';
|
||||||
|
import 'package:unittest/vm_config.dart';
|
||||||
|
|
||||||
|
import 'bind_generator/simple.dart' as bindGenerator;
|
||||||
|
import 'directive_linker/simple.dart' as directiveLinker;
|
||||||
|
import 'directive_processor/simple.dart' as directiveProcessor;
|
||||||
|
import 'integration/hello_world.dart' as helloWorld;
|
||||||
|
import 'reflection_remover/simple.dart' as reflectionRemover;
|
||||||
|
import 'template_compiler/inline.dart' as inlineTemplateCompiler;
|
||||||
|
import 'template_compiler/url.dart' as urlTemplateCompiler;
|
||||||
|
|
||||||
|
main() {
|
||||||
|
useVMConfiguration();
|
||||||
|
describe('Bind Generator Benchmark', bindGenerator.allTests);
|
||||||
|
describe('Directive Linker Benchmark', directiveLinker.allTests);
|
||||||
|
describe('Directive Processor Benchmark', directiveProcessor.allTests);
|
||||||
|
describe('Hello World Transformer Benchmark', helloWorld.allTests);
|
||||||
|
describe('Reflection Remover Benchmark', reflectionRemover.allTests);
|
||||||
|
describe('Inline Template Compiler Benchmark',
|
||||||
|
inlineTemplateCompiler.allTests);
|
||||||
|
describe('Url Template Compiler Benchmark', urlTemplateCompiler.allTests);
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
library angular2.benchmark.transform.bind_generator.simple;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/bind_generator/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Bind Generator Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var options = new TransformerOptions(['this_is_ignored.dart']);
|
||||||
|
var files = {new AssetId('a', 'a.ng_deps.dart'): aContents};
|
||||||
|
var benchmark =
|
||||||
|
new TransformerBenchmark([[new BindGenerator(options)]], files);
|
||||||
|
print('\nRunning bind_generator benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const aContents = '''
|
||||||
|
library bar.ng_deps.dart;
|
||||||
|
|
||||||
|
import 'bar.dart';
|
||||||
|
import 'package:angular2/src/core/annotations/annotations.dart';
|
||||||
|
|
||||||
|
bool _visited = false;
|
||||||
|
void initReflector(reflector) {
|
||||||
|
if (_visited) return;
|
||||||
|
_visited = true;
|
||||||
|
reflector
|
||||||
|
..registerType(ToolTip, {
|
||||||
|
'factory': () => new ToolTip(),
|
||||||
|
'parameters': const [],
|
||||||
|
'annotations': const [
|
||||||
|
const Decorator(
|
||||||
|
selector: '[tool-tip]', bind: const {'text': 'tool-tip'})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}''';
|
|
@ -0,0 +1,80 @@
|
||||||
|
library angular2.benchmark.transform.directive_linker.simple;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/directive_linker/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Directive Linker Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var files = {
|
||||||
|
new AssetId('a', 'a.ng_deps.dart'): aContents,
|
||||||
|
new AssetId('a', 'b.ng_deps.dart'): bContents,
|
||||||
|
new AssetId('a', 'c.ng_deps.dart'): cContents,
|
||||||
|
};
|
||||||
|
var benchmark = new TransformerBenchmark([[new DirectiveLinker()]], files);
|
||||||
|
print('\nRunning directive_linker benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const aContents = '''
|
||||||
|
library a.ng_deps.dart;
|
||||||
|
|
||||||
|
import 'package:angular2/src/core/application.dart';
|
||||||
|
import 'package:angular2/src/reflection/reflection_capabilities.dart';
|
||||||
|
import 'b.dart';
|
||||||
|
|
||||||
|
bool _visited = false;
|
||||||
|
void initReflector(reflector) {
|
||||||
|
if (_visited) return;
|
||||||
|
_visited = true;
|
||||||
|
}''';
|
||||||
|
|
||||||
|
const bContents = '''
|
||||||
|
library b.ng_deps.dart;
|
||||||
|
|
||||||
|
import 'b.dart';
|
||||||
|
import 'package:angular2/src/core/annotations/annotations.dart';
|
||||||
|
|
||||||
|
bool _visited = false;
|
||||||
|
void initReflector(reflector) {
|
||||||
|
if (_visited) return;
|
||||||
|
_visited = true;
|
||||||
|
reflector
|
||||||
|
..registerType(DependencyComponent, {
|
||||||
|
'factory': () => new DependencyComponent(),
|
||||||
|
'parameters': const [],
|
||||||
|
'annotations': const [const Component(selector: '[salad]')]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
''';
|
||||||
|
|
||||||
|
const cContents = '''
|
||||||
|
library c.ng_deps.dart;
|
||||||
|
|
||||||
|
import 'c.dart';
|
||||||
|
import 'package:angular2/src/core/annotations/annotations.dart';
|
||||||
|
import 'b.dart' as dep;
|
||||||
|
|
||||||
|
bool _visited = false;
|
||||||
|
void initReflector(reflector) {
|
||||||
|
if (_visited) return;
|
||||||
|
_visited = true;
|
||||||
|
reflector
|
||||||
|
..registerType(MyComponent, {
|
||||||
|
'factory': () => new MyComponent(),
|
||||||
|
'parameters': const [],
|
||||||
|
'annotations': const [
|
||||||
|
const Component(
|
||||||
|
selector: '[soup]', services: const [dep.DependencyComponent])
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}''';
|
|
@ -0,0 +1,35 @@
|
||||||
|
library angular2.benchmark.transform.directive_processor.simple;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/directive_processor/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Directive Processor Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var options = new TransformerOptions(['this_is_ignored.dart']);
|
||||||
|
var files = {new AssetId('a', 'a.dart'): aContents,};
|
||||||
|
var benchmark =
|
||||||
|
new TransformerBenchmark([[new DirectiveProcessor(options)]], files);
|
||||||
|
print('\nRunning directive_processor benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const aContents = '''
|
||||||
|
library dinner.soup;
|
||||||
|
|
||||||
|
import 'package:angular2/src/core/annotations/annotations.dart';
|
||||||
|
|
||||||
|
@Component(selector: '[soup]')
|
||||||
|
class SoupComponent {
|
||||||
|
SoupComponent(@Tasty String description, @Inject(Salt) salt);
|
||||||
|
}
|
||||||
|
''';
|
|
@ -0,0 +1,84 @@
|
||||||
|
library angular2.benchmark.transform.integration.hello_world;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Hello World Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var options = new TransformerOptions(['index.dart']);
|
||||||
|
var files = {
|
||||||
|
new AssetId('a', 'web/index.dart'): indexContents,
|
||||||
|
new AssetId('a', 'web/index_common.dart'): indexCommonContents,
|
||||||
|
};
|
||||||
|
var benchmark = new TransformerBenchmark(
|
||||||
|
new AngularTransformerGroup(options).phases, files);
|
||||||
|
print('\nRunning hello_world benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const indexContents = '''
|
||||||
|
library examples.src.hello_world.index;
|
||||||
|
|
||||||
|
import "index_common.dart" as app;
|
||||||
|
import "package:angular2/src/reflection/reflection.dart" show reflector;
|
||||||
|
import "package:angular2/src/reflection/reflection_capabilities.dart"
|
||||||
|
show ReflectionCapabilities;
|
||||||
|
|
||||||
|
main() {
|
||||||
|
reflector.reflectionCapabilities = new ReflectionCapabilities();
|
||||||
|
app.main();
|
||||||
|
}
|
||||||
|
''';
|
||||||
|
|
||||||
|
const indexCommonContents = '''
|
||||||
|
library examples.src.hello_world.index_common;
|
||||||
|
|
||||||
|
import "package:angular2/angular2.dart"
|
||||||
|
show bootstrap, Component, Decorator, Template, NgElement;
|
||||||
|
import "package:angular2/di.dart" show Injectable;
|
||||||
|
|
||||||
|
@Component(selector: "hello-app", services: const [GreetingService])
|
||||||
|
@Template(
|
||||||
|
inline: '<div class="greeting">{{greeting}} <span red>world</span>!</div>'
|
||||||
|
'<button class="changeButton" (click)="changeGreeting()">'
|
||||||
|
'change greeting</button><content></content>',
|
||||||
|
directives: const [RedDec])
|
||||||
|
class HelloCmp {
|
||||||
|
String greeting;
|
||||||
|
HelloCmp(GreetingService service) {
|
||||||
|
this.greeting = service.greeting;
|
||||||
|
}
|
||||||
|
changeGreeting() {
|
||||||
|
this.greeting = "howdy";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Decorator(selector: "[red]")
|
||||||
|
class RedDec {
|
||||||
|
RedDec(NgElement el) {
|
||||||
|
el.domElement.style.color = "red";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
class GreetingService {
|
||||||
|
String greeting;
|
||||||
|
GreetingService() {
|
||||||
|
this.greeting = "hello";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
bootstrap(HelloCmp);
|
||||||
|
}
|
||||||
|
''';
|
|
@ -0,0 +1,36 @@
|
||||||
|
library angular2.benchmark.transform.reflection_remover.simple;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/reflection_remover/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Reflection Remover Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var options = new TransformerOptions(['web/index.dart']);
|
||||||
|
var files = {new AssetId('a', 'web/index.dart'): indexContents,};
|
||||||
|
var benchmark =
|
||||||
|
new TransformerBenchmark([[new ReflectionRemover(options)]], files);
|
||||||
|
print('\nRunning reflection_remover benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const indexContents = '''
|
||||||
|
library web_foo;
|
||||||
|
|
||||||
|
import 'package:angular2/src/core/application.dart';
|
||||||
|
import 'package:angular2/src/reflection/reflection.dart';
|
||||||
|
import 'package:angular2/src/reflection/reflection_capabilities.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
reflector.reflectionCapabilities = new ReflectionCapabilities();
|
||||||
|
bootstrap(MyComponent);
|
||||||
|
}''';
|
|
@ -0,0 +1,48 @@
|
||||||
|
library angular2.benchmark.transform.template_compiler.inline;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/template_compiler/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Inline Template Compiler Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var options = new TransformerOptions(['index.dart']);
|
||||||
|
var files = {new AssetId('a', 'web/a.ng_deps.dart'): aContents,};
|
||||||
|
var benchmark =
|
||||||
|
new TransformerBenchmark([[new TemplateCompiler(options)]], files);
|
||||||
|
print('\nRunning template_compiler inline benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const aContents = '''
|
||||||
|
library examples.src.hello_world.index_common_dart;
|
||||||
|
|
||||||
|
import 'hello.dart';
|
||||||
|
import 'package:angular2/angular2.dart'
|
||||||
|
show bootstrap, Component, Decorator, Template, NgElement;
|
||||||
|
|
||||||
|
bool _visited = false;
|
||||||
|
void initReflector(reflector) {
|
||||||
|
if (_visited) return;
|
||||||
|
_visited = true;
|
||||||
|
reflector
|
||||||
|
..registerType(HelloCmp, {
|
||||||
|
'factory': () => new HelloCmp(),
|
||||||
|
'parameters': const [const []],
|
||||||
|
'annotations': const [
|
||||||
|
const Component(selector: 'hello-app'),
|
||||||
|
const Template(
|
||||||
|
inline: '<button (click)="action()">go</button>{{greeting}}')
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
''';
|
|
@ -0,0 +1,55 @@
|
||||||
|
library angular2.benchmark.transform.template_compiler.url;
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:angular2/src/transform/common/options.dart';
|
||||||
|
import 'package:angular2/src/transform/template_compiler/transformer.dart';
|
||||||
|
import 'package:barback/barback.dart';
|
||||||
|
import 'package:code_transformers/benchmarks.dart';
|
||||||
|
import 'package:unittest/unittest.dart';
|
||||||
|
|
||||||
|
Future main() => runBenchmark();
|
||||||
|
|
||||||
|
allTests() {
|
||||||
|
test('Url Template Compiler Benchmark Runs', runBenchmark);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future runBenchmark() async {
|
||||||
|
var options = new TransformerOptions(['index.dart']);
|
||||||
|
var files = {
|
||||||
|
new AssetId('a', 'web/a.ng_deps.dart'): aContents,
|
||||||
|
new AssetId('a', 'web/template.html'): templateContents,
|
||||||
|
};
|
||||||
|
var benchmark =
|
||||||
|
new TransformerBenchmark([[new TemplateCompiler(options)]], files);
|
||||||
|
print('\nRunning template_compiler url benchmark...');
|
||||||
|
var result = await benchmark.measure();
|
||||||
|
print('Done, took ${result.round()}μs on average.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const aContents = '''
|
||||||
|
library examples.src.hello_world.index_common_dart;
|
||||||
|
|
||||||
|
import 'hello.dart';
|
||||||
|
import 'package:angular2/angular2.dart'
|
||||||
|
show bootstrap, Component, Decorator, Template, NgElement;
|
||||||
|
|
||||||
|
bool _visited = false;
|
||||||
|
void initReflector(reflector) {
|
||||||
|
if (_visited) return;
|
||||||
|
_visited = true;
|
||||||
|
reflector
|
||||||
|
..registerType(HelloCmp, {
|
||||||
|
'factory': () => new HelloCmp(),
|
||||||
|
'parameters': const [const []],
|
||||||
|
'annotations': const [
|
||||||
|
const Component(selector: 'hello-app'),
|
||||||
|
const Template(url: 'template.html')
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
''';
|
||||||
|
|
||||||
|
const templateContents = '''
|
||||||
|
<button (click)="action()">go</button>
|
||||||
|
{{greeting}}
|
||||||
|
''';
|
Loading…
Reference in New Issue