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