Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
|
Lasse Reichstein Nielsen
2013/02/28 11:00:50
Fixed 2013.
| |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library map_test; | |
| 6 import 'dart:collection'; | |
| 7 | |
| 8 // Test that length/isEmpty opertions are constant time on | |
| 9 // maps, strings and collections. | |
| 10 | |
| 11 void testString(int n) { | |
| 12 String s = "x"; | |
| 13 String string = ""; | |
| 14 int length = n; | |
| 15 while (true) { | |
| 16 if ((length & 1) == 1) { | |
| 17 string = string.concat(s); | |
| 18 } | |
| 19 length >>= 1; | |
| 20 if (length == 0) break; | |
| 21 s = s.concat(s); | |
| 22 } | |
| 23 testLength(string, n); | |
| 24 testLength(string.codeUnits, n); | |
| 25 } | |
| 26 | |
| 27 void testMap(Map map, int n) { | |
| 28 for (int i = 0; i < n; i++) { | |
| 29 map[i] = i; | |
| 30 } | |
| 31 testLength(map, n); | |
| 32 testLength(map.keys, n); | |
| 33 testLength(map.values, n); | |
| 34 } | |
| 35 | |
| 36 void testCollection(Collection collection, n) { | |
| 37 for (int i = 0; i < n; i++) { | |
| 38 collection.add(i); | |
| 39 } | |
| 40 testLength(collection, n); | |
| 41 } | |
| 42 | |
| 43 void testList(List list, n) { | |
| 44 for (int i = 0; i < n; i++) { | |
| 45 list[i] = i; | |
| 46 } | |
| 47 testLength(list, n); | |
| 48 } | |
| 49 | |
| 50 | |
| 51 void testLength(var lengthable, int size) { | |
| 52 print(lengthable.runtimeType); // Show what hangs the test. | |
| 53 int length = 0; | |
| 54 // If length or isEmpty is not a constant-time (or very fast) operation, | |
| 55 // this will timeout. | |
| 56 for (int i = 0; i < 100000; i++) { | |
| 57 if (!lengthable.isEmpty) length += lengthable.length; | |
| 58 } | |
| 59 if (length != size * 100000) throw "Bad length: $length / size: $size"; | |
| 60 } | |
| 61 | |
| 62 | |
| 63 main() { | |
| 64 const int N = 100000; | |
| 65 testMap(new HashMap(), N); | |
| 66 testMap(new LinkedHashMap(), N); | |
| 67 testMap(new SplayTreeMap(), N); | |
| 68 testCollection(new HashSet(), N); | |
| 69 testCollection(new LinkedHashSet(), N); | |
| 70 testCollection(new ListQueue(), N); | |
| 71 testList(new List()..length = N, N); | |
| 72 testList(new List(N), N); | |
| 73 testString(N); | |
| 74 // DoubleLinkedQueue has linear length, but fast isEmpty. | |
| 75 } | |
| OLD | NEW |