|  | // Copyright (c) 2019, 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. | 
|  |  | 
|  | import 'dart:collection'; | 
|  | import 'dart:typed_data'; | 
|  |  | 
|  | import 'package:benchmark_harness/benchmark_harness.dart'; | 
|  |  | 
|  | import 'sound_splay_tree.dart'; | 
|  |  | 
|  | List<int> sieve(List<int> initialCandidates) { | 
|  | final candidates = SplayTreeSet<int>.from(initialCandidates); | 
|  | final int last = candidates.last; | 
|  | final primes = <int>[]; | 
|  | // ignore: literal_only_boolean_expressions | 
|  | while (true) { | 
|  | final int prime = candidates.first; | 
|  | if (prime * prime > last) break; | 
|  | primes.add(prime); | 
|  | for (int i = prime; i <= last; i += prime) { | 
|  | candidates.remove(i); | 
|  | } | 
|  | } | 
|  | return primes..addAll(candidates); | 
|  | } | 
|  |  | 
|  | List<int> sieveSound(List<int> initialCandidates) { | 
|  | final candidates = SoundSplayTreeSet<int>.from(initialCandidates); | 
|  | final int last = candidates.last; | 
|  | final primes = <int>[]; | 
|  | // ignore: literal_only_boolean_expressions | 
|  | while (true) { | 
|  | final int prime = candidates.first; | 
|  | if (prime * prime > last) break; | 
|  | primes.add(prime); | 
|  | for (int i = prime; i <= last; i += prime) { | 
|  | candidates.remove(i); | 
|  | } | 
|  | } | 
|  | return primes..addAll(candidates); | 
|  | } | 
|  |  | 
|  | /// Returns a list of integers from [first] to [last], both inclusive. | 
|  | List<int> range(int first, int last) { | 
|  | return List<int>.generate(last - first + 1, (int i) => i + first); | 
|  | } | 
|  |  | 
|  | int id(int x) => x; | 
|  | int add1(int i) => 1 + i; | 
|  | bool isEven(int i) => i.isEven; | 
|  | void exercise(Iterable<int> hello) { | 
|  | if (hello.toList().length != 5) throw 'x1'; | 
|  | if (List.from(hello).length != 5) throw 'x1'; | 
|  | if (Set.from(hello).length != 4) throw 'x1'; | 
|  | if (List<int>.from(hello).where(isEven).length != 3) throw 'x1'; | 
|  | if (hello.where(isEven).length != 3) throw 'x1'; | 
|  | if (hello.map(add1).where(isEven).length != 2) throw 'x1'; | 
|  | if (hello.where(isEven).map(add1).length != 3) throw 'x1'; | 
|  | } | 
|  |  | 
|  | void busyWork() { | 
|  | // A lot of busy-work calling map/where/toList/List.from to ensure the core | 
|  | // library is used with some degree of polymorphism. | 
|  | final L1 = 'hello'.codeUnits; | 
|  | final L2 = Uint16List(5)..setRange(0, 5, L1); | 
|  | final L3 = Uint32List(5)..setRange(0, 5, L1); | 
|  | exercise(L1); | 
|  | exercise(L2); | 
|  | exercise(L3); | 
|  | exercise(UnmodifiableListView<int>(L1)); | 
|  | exercise(UnmodifiableListView<int>(L2)); | 
|  | exercise(UnmodifiableListView<int>(L3)); | 
|  | exercise(L1.asMap().values); | 
|  | exercise(L1.toList().asMap().values); | 
|  | final M1 = Map<String, int>.fromIterables(<String>[ | 
|  | 'a', | 
|  | 'b', | 
|  | 'c', | 
|  | 'd', | 
|  | 'e', | 
|  | ], L1); | 
|  | final M2 = const <String, int>{ | 
|  | 'a': 104, | 
|  | 'b': 101, | 
|  | 'c': 108, | 
|  | 'd': 108, | 
|  | 'e': 111, | 
|  | }; | 
|  | exercise(M1.values); | 
|  | exercise(M2.values); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | final benchmarks = [ | 
|  | Base(sieve, 'CollectionSieves-SplayTreeSet-removeLoop'), | 
|  | Base(sieveSound, 'CollectionSieves-SoundSplayTreeSet-removeLoop'), | 
|  | ]; | 
|  | for (int i = 0; i < 10; i++) { | 
|  | busyWork(); | 
|  | for (var bm in benchmarks) { | 
|  | bm.run(); | 
|  | } | 
|  | } | 
|  | for (var bm in benchmarks) { | 
|  | bm.report(); | 
|  | } | 
|  | } | 
|  |  | 
|  | class Base extends BenchmarkBase { | 
|  | final algorithm; | 
|  | Base(this.algorithm, String name) : super(name); | 
|  | static final input = range(2, 5000); | 
|  | @override | 
|  | void run() { | 
|  | final primes = algorithm(input); | 
|  | if (primes.length != 669) throw 'Wrong result for $name: ${primes.length}'; | 
|  | } | 
|  | } |