|
5 | 5 | import 'dart:math'; |
6 | 6 |
|
7 | 7 | import 'package:_pub_shared/search/search_form.dart'; |
| 8 | +import 'package:collection/collection.dart'; |
8 | 9 | import 'package:pub_dev/search/search_service.dart'; |
9 | 10 | import 'package:pub_dev/service/entrypoint/_isolate.dart'; |
10 | 11 | import 'package:pub_dev/service/entrypoint/search_index.dart'; |
@@ -42,19 +43,29 @@ Future<void> main(List<String> args) async { |
42 | 43 |
|
43 | 44 | Future<void> _benchmark(IsolateRunner primary, IsolateRunner reduced) async { |
44 | 45 | final index = IsolateSearchIndex(primary, reduced); |
45 | | - final sw = Stopwatch()..start(); |
46 | | - for (var i = 0; i < 10; i++) { |
| 46 | + final durations = <String, List<int>>{}; |
| 47 | + for (var i = 0; i < 100; i++) { |
47 | 48 | final random = Random(i); |
48 | 49 | final items = queries |
49 | | - .expand((q) => List.generate(10, (_) => q)) |
50 | 50 | .map((q) => ServiceSearchQuery.parse( |
51 | 51 | query: q, |
52 | 52 | tagsPredicate: TagsPredicate.regularSearch(), |
53 | 53 | )) |
54 | 54 | .toList(); |
55 | 55 | items.shuffle(random); |
56 | | - await Future.wait(items.map((q) async => index.search(q))); |
| 56 | + await Future.wait(items.map((q) async { |
| 57 | + final sw = Stopwatch()..start(); |
| 58 | + await index.search(q); |
| 59 | + final d = sw.elapsed.inMicroseconds; |
| 60 | + durations.putIfAbsent('all', () => []).add(d); |
| 61 | + final key = q.parsedQuery.hasFreeText ? 'primary' : 'reduced'; |
| 62 | + durations.putIfAbsent(key, () => []).add(d); |
| 63 | + })); |
| 64 | + } |
| 65 | + for (final e in durations.entries) { |
| 66 | + e.value.sort(); |
| 67 | + print('${e.key.padLeft(10)}: ' |
| 68 | + '${e.value.average.round().toString().padLeft(10)} avg ' |
| 69 | + '${e.value[e.value.length * 90 ~/ 100].toString().padLeft(10)} p90'); |
57 | 70 | } |
58 | | - sw.stop(); |
59 | | - print(sw.elapsedMilliseconds); |
60 | 71 | } |
0 commit comments