| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| // |
| // Generates both the dart and dart2 version of this benchmark. |
| |
| import 'dart:io'; |
| import 'dart:math'; |
| |
| import 'package:path/path.dart' as path; |
| |
| const String benchmarkName = 'InstantiateTypeArgs'; |
| |
| const List<int> instantiateCounts = [1, 5, 10, 100, 1000]; |
| |
| void generateBenchmarkClassesAndUtilities(IOSink output, {required bool nnbd}) { |
| output.writeln(''' |
| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| // |
| // This benchmark suite measures the overhead of instantiating type arguments, |
| // with a particular aim of measuring the overhead of the caching mechanism. |
| '''); |
| |
| if (!nnbd) { |
| output.writeln(''' |
| // @dart=2.9" |
| '''); |
| } |
| |
| output.write(''' |
| import 'package:benchmark_harness/benchmark_harness.dart'; |
| |
| void main() { |
| '''); |
| for (final count in instantiateCounts) { |
| output.write(''' |
| const Instantiate$count().report(); |
| '''); |
| } |
| output.writeln(''' |
| } |
| '''); |
| |
| for (final count in instantiateCounts) { |
| output.write(''' |
| class Instantiate$count extends BenchmarkBase { |
| const Instantiate$count() : super('$benchmarkName.Instantiate$count'); |
| |
| // Normalize the cost across the benchmarks by number of instantiations. |
| @override |
| void report() => emitter.emit(name, measure() / $count); |
| |
| @override |
| void run() { |
| '''); |
| |
| for (int i = 0; i < count; i++) { |
| output.write(''' |
| D.instantiate<C$i>(); |
| '''); |
| } |
| |
| output.writeln(''' |
| } |
| } |
| '''); |
| } |
| |
| output.write(''' |
| @pragma('vm:never-inline') |
| @pragma('dart2js:never-inline') |
| void blackhole<T>() => null; |
| |
| class D<T> { |
| @pragma('vm:never-inline') |
| @pragma('dart2js:never-inline') |
| static void instantiate<S>() => blackhole<D<S>>(); |
| } |
| '''); |
| |
| final maxCount = instantiateCounts.reduce(((v, e) => max(v, e))); |
| for (int i = 0; i < maxCount; i++) { |
| output.write(''' |
| |
| class C${i} {} |
| '''); |
| } |
| } |
| |
| void main() { |
| final dartFilePath = path.join( |
| path.dirname(Platform.script.path), 'dart', '$benchmarkName.dart'); |
| final dartSink = File(dartFilePath).openWrite(); |
| generateBenchmarkClassesAndUtilities(dartSink, nnbd: true); |
| dartSink..flush(); |
| |
| final dart2FilePath = path.join( |
| path.dirname(Platform.script.path), 'dart2', '$benchmarkName.dart'); |
| final dart2Sink = File(dart2FilePath).openWrite(); |
| generateBenchmarkClassesAndUtilities(dart2Sink, nnbd: false); |
| dart2Sink..flush(); |
| } |