• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2019 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import '../common.dart';
6
7const int _kNumIterations = 1000;
8const int _kNumWarmUp = 100;
9
10void main() {
11  assert(false, "Don't run benchmarks in checked mode! Use 'flutter run --release'.");
12
13  // Warm up lap
14  for (int i = 0; i < _kNumWarmUp; i += 1) {
15    sumIterable(generateIterableSyncStar());
16    sumIterable(generateIterableList());
17    sumIterable(Iterable<int>.generate(100, generate));
18  }
19
20  final Stopwatch watch = Stopwatch();
21  watch.start();
22  for (int i = 0; i < _kNumIterations; i += 1) {
23    sumIterable(generateIterableSyncStar());
24  }
25  final int traverseIterableSyncStar = watch.elapsedMicroseconds;
26  watch
27    ..reset()
28    ..start();
29  for (int i = 0; i < _kNumIterations; i += 1) {
30    sumIterable(generateIterableList());
31  }
32  final int traverseIterableList = watch.elapsedMicroseconds;
33  watch
34    ..reset()
35    ..start();
36  for (int i = 0; i < _kNumIterations; i += 1) {
37    sumIterable(Iterable<int>.generate(100, generate));
38  }
39  final int traverseIterableGenerated = watch.elapsedMicroseconds;
40  watch
41    ..reset()
42    ..start();
43
44  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
45  const double scale = 1000.0 / _kNumIterations;
46  printer.addResult(
47    description: 'traverseIterableSyncStar',
48    value: traverseIterableSyncStar * scale,
49    unit: 'ns per iteration',
50    name: 'traverseIterableSyncStar_iteration',
51  );
52  printer.addResult(
53    description: 'traverseIterableList',
54    value: traverseIterableList * scale,
55    unit: 'ns per iteration',
56    name: 'traverseIterableList_iteration',
57  );
58  printer.addResult(
59    description: 'traverseIterableGenerated',
60    value: traverseIterableGenerated * scale,
61    unit: 'ns per iteration',
62    name: 'traverseIterableGenerated_iteration',
63  );
64  printer.printToStdout();
65}
66
67int generate(int index) => index;
68
69// Generate an Iterable using a sync* method.
70Iterable<int> generateIterableSyncStar() sync* {
71  for (int i = 0; i < 100; i++) {
72    yield i;
73  }
74}
75
76// Generate an Iterable using a List.
77Iterable<int> generateIterableList() {
78  final List<int> items = <int>[];
79  for (int i = 0; i < 100; i++) {
80    items.add(i);
81  }
82  return items;
83}
84
85int sumIterable(Iterable<int> values) {
86  int result = 0;
87  for (int value in values) {
88    result += value;
89  }
90  return result;
91}
92