ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/MapCheck.java
Revision: 1.19
Committed: Sun Oct 23 03:03:23 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.18: +1 -1 lines
Log Message:
fix deprecation warnings for Class#newInstance

File Contents

# User Rev Content
1 dl 1.2 /*
2     * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.13 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.2 */
6 dl 1.1 /**
7     * @test
8     * @synopsis Times and checks basic map operations
9 dl 1.4 *
10     * When run with "s" second arg, this requires file "testwords", which
11     * is best used with real words. We can't check in this file, but you
12 jsr166 1.7 * can create one from a real dictionary (1 line per word) and then run
13 dl 1.4 * linux "shuf" to randomize entries.
14 dl 1.1 */
15 jsr166 1.17 import java.io.*;
16 dl 1.1 import java.util.*;
17    
18     public class MapCheck {
19 dl 1.4 static final Object MISSING = new Object();
20     static TestTimer timer = new TestTimer();
21 jsr166 1.16 static Class<?> eclass;
22     static Class<?> mapClass = java.util.concurrent.ConcurrentHashMap.class;
23 dl 1.1
24 dl 1.4 static final LoopHelpers.SimpleRandom srng = new LoopHelpers.SimpleRandom();
25     static final Random rng = new Random(3152688);
26 dl 1.1
27 dl 1.4 static volatile int checkSum;
28 dl 1.1
29     static void reallyAssert(boolean b) {
30     if (!b) throw new Error("Failed Assertion");
31     }
32    
33     public static void main(String[] args) throws Exception {
34 dl 1.4 int numTests = 100;
35     int size = 36864; // about midway of HashMap resize interval
36 dl 1.1
37 dl 1.4 if (args.length == 0)
38     System.out.println("Usage: MapCheck mapclass [int|float|string|object] [trials] [size] [serialtest]");
39 jsr166 1.6
40 dl 1.1 if (args.length > 0) {
41     try {
42     mapClass = Class.forName(args[0]);
43 jsr166 1.8 } catch (ClassNotFoundException e) {
44 dl 1.1 throw new RuntimeException("Class " + args[0] + " not found.");
45     }
46 jsr166 1.6 }
47 dl 1.4
48     if (args.length > 1) {
49     String et = args[1].toLowerCase();
50     if (et.startsWith("i"))
51     eclass = java.lang.Integer.class;
52     else if (et.startsWith("f"))
53     eclass = java.lang.Float.class;
54     else if (et.startsWith("s"))
55     eclass = java.lang.String.class;
56 dl 1.5 else if (et.startsWith("d"))
57     eclass = java.lang.Double.class;
58 dl 1.1 }
59 dl 1.4 if (eclass == null)
60     eclass = Object.class;
61 dl 1.1
62 jsr166 1.6 if (args.length > 2)
63 dl 1.4 numTests = Integer.parseInt(args[2]);
64 dl 1.1
65 jsr166 1.6 if (args.length > 3)
66 dl 1.4 size = Integer.parseInt(args[3]);
67 dl 1.1
68 dl 1.4 boolean doSerializeTest = args.length > 4;
69 dl 1.1
70 dl 1.4 while ((size & 3) != 0) ++size;
71 dl 1.1
72 dl 1.4 System.out.print("Class: " + mapClass.getName());
73     System.out.print(" elements: " + eclass.getName());
74     System.out.print(" trials: " + numTests);
75     System.out.print(" size: " + size);
76     System.out.println();
77 dl 1.1
78     Object[] key = new Object[size];
79 dl 1.4 Object[] absent = new Object[size];
80     initializeKeys(key, absent, size);
81 dl 1.1
82 jsr166 1.14 precheck(size, key, absent);
83 dl 1.1
84     for (int rep = 0; rep < numTests; ++rep) {
85 dl 1.4 mainTest(newMap(), key, absent);
86     if ((rep & 3) == 3 && rep < numTests - 1) {
87     shuffle(key);
88     // Thread.sleep(10);
89     }
90 dl 1.1 }
91    
92     TestTimer.printStats();
93    
94 dl 1.4 checkNullKey();
95 dl 1.1
96     if (doSerializeTest)
97 dl 1.4 serTest(newMap(), size);
98 dl 1.1 }
99    
100 dl 1.4 static Map newMap() {
101 dl 1.1 try {
102 jsr166 1.19 return (Map) mapClass.getConstructor().newInstance();
103 jsr166 1.8 } catch (Exception e) {
104 dl 1.4 throw new RuntimeException("Can't instantiate " + mapClass + ": " + e);
105 dl 1.1 }
106     }
107    
108 dl 1.4 static void precheck(int n, Object[] key, Object[] abs) {
109     int ck = 0;
110     Map s = newMap();
111     for (int i = 0; i < n; i++) {
112     Object k = key[i];
113     if (k == null) throw new Error("Null key at" + i);
114     ck += System.identityHashCode(k);
115     Object v = s.put(k, k);
116     if (v != null)
117     throw new Error("Duplicate " + k + " / " + v);
118     }
119     for (int i = 0; i < n; i++) {
120     Object k = abs[i];
121     if (k == null) throw new Error("Null key at" + i);
122     ck += System.identityHashCode(k);
123     Object v = s.put(k, k);
124     if (v != null)
125     throw new Error("Duplicate " + k + " / " + v);
126     }
127     checkSum += ck;
128     }
129 dl 1.1
130 dl 1.4 static void checkNullKey() {
131     Map m = newMap();
132     Object x = new Object();
133     Object v;
134     try {
135     m.put(null, x);
136     v = m.get(null);
137 jsr166 1.8 } catch (NullPointerException npe) {
138 dl 1.4 System.out.println("Map does not allow null keys");
139     return;
140     }
141     if (v != x) throw new Error();
142     if (m.remove(null) != v) throw new Error();
143     if (m.get(null) != null) throw new Error();
144 dl 1.1 }
145    
146 dl 1.4 static void getTest(String nm, int n, Map s, Object[] key, int expect) {
147 dl 1.1 int sum = 0;
148 dl 1.4 timer.start(nm, n);
149     for (int i = 0; i < n; i++) {
150     Object v = s.get(key[i]);
151     if (v != null && v.getClass() == eclass)
152     ++sum;
153     }
154 jsr166 1.6 timer.finish();
155 jsr166 1.12 reallyAssert(sum == expect);
156 dl 1.4 checkSum += sum;
157 dl 1.1 }
158    
159 dl 1.4 // unused
160     static void getTestBoxed(String nm, int n, Map s, Object[] key, int expect) {
161 dl 1.1 int sum = 0;
162 dl 1.4 Map<Integer,Integer> intMap = (Map<Integer,Integer>)s;
163     timer.start(nm, n);
164     for (int i = 0; i < n; i++) {
165 jsr166 1.10 if (intMap.get(i) != i) ++sum;
166 dl 1.1 }
167 jsr166 1.6 timer.finish();
168 jsr166 1.12 reallyAssert(sum == expect);
169 dl 1.1 }
170    
171 dl 1.4 static void remTest(String nm, int n, Map s, Object[] key, int expect) {
172 dl 1.1 int sum = 0;
173     timer.start(nm, n);
174     for (int i = 0; i < n; i++) {
175     if (s.remove(key[i]) != null) ++sum;
176     }
177 jsr166 1.6 timer.finish();
178 jsr166 1.12 reallyAssert(sum == expect);
179 dl 1.4 checkSum += sum;
180     }
181    
182     static void clrTest(int n, Map s) {
183     String nm = "Remove Present ";
184     timer.start(nm, n);
185     s.clear();
186 jsr166 1.6 timer.finish();
187 jsr166 1.12 reallyAssert(s.isEmpty());
188 dl 1.1 }
189    
190 dl 1.4 static void putTest(String nm, int n, Map s, Object[] key, int expect) {
191 dl 1.1 int sum = 0;
192     timer.start(nm, n);
193     for (int i = 0; i < n; i++) {
194 dl 1.4 Object k = key[i];
195     Object v = s.put(k, k);
196     if (v == null) ++sum;
197 dl 1.1 }
198 jsr166 1.6 timer.finish();
199 jsr166 1.12 reallyAssert(sum == expect);
200 dl 1.4 checkSum += sum;
201 dl 1.1 }
202    
203 dl 1.4 static void keyTest(String nm, int n, Map s, Object[] key, int expect) {
204 dl 1.1 int sum = 0;
205     timer.start(nm, n);
206     for (int i = 0; i < n; i++) {
207     if (s.containsKey(key[i])) ++sum;
208     }
209 jsr166 1.6 timer.finish();
210 jsr166 1.12 reallyAssert(sum == expect);
211 dl 1.4 checkSum += sum;
212     }
213    
214     // version without timing for uncategorized tests
215     static void untimedKeyTest(String nm, int n, Map s, Object[] key, int expect) {
216     int sum = 0;
217     for (int i = 0; i < n; i++) {
218     if (s.containsKey(key[i])) ++sum;
219     }
220 jsr166 1.12 reallyAssert(sum == expect);
221 dl 1.4 checkSum += sum;
222 dl 1.1 }
223    
224 dl 1.4 static void remHalfTest(String nm, int n, Map s, Object[] key, int expect) {
225 dl 1.1 int sum = 0;
226     timer.start(nm, n/2);
227     for (int i = n-2; i >= 0; i-=2) {
228     if (s.remove(key[i]) != null) ++sum;
229     }
230 jsr166 1.6 timer.finish();
231 jsr166 1.12 reallyAssert(sum == expect);
232 dl 1.4 checkSum += sum;
233 dl 1.1 }
234    
235 dl 1.4 static void valTest(Map s, Object[] key) {
236     int size = s.size();
237 dl 1.1 int sum = 0;
238 dl 1.5 timer.start("Traverse key or value ", size);
239 dl 1.4 if (s.containsValue(MISSING)) ++sum;
240 jsr166 1.6 timer.finish();
241 jsr166 1.12 reallyAssert(sum == 0);
242 dl 1.4 checkSum += sum;
243 dl 1.1 }
244    
245 dl 1.4 static Object kitTest(Map s, int size) {
246     Object last = null;
247 dl 1.1 int sum = 0;
248 dl 1.5 timer.start("Traverse key or value ", size);
249 dl 1.4 for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
250     Object x = it.next();
251     if (x != last && x != null && x.getClass() == eclass)
252     ++sum;
253     last = x;
254 dl 1.1 }
255 jsr166 1.6 timer.finish();
256 jsr166 1.12 reallyAssert(sum == size);
257 dl 1.4 checkSum += sum;
258     return last;
259 dl 1.1 }
260    
261 dl 1.4 static Object vitTest(Map s, int size) {
262     Object last = null;
263 dl 1.1 int sum = 0;
264 dl 1.5 timer.start("Traverse key or value ", size);
265 dl 1.4 for (Iterator it = s.values().iterator(); it.hasNext(); ) {
266     Object x = it.next();
267     if (x != last && x != null && x.getClass() == eclass)
268     ++sum;
269     last = x;
270 dl 1.1 }
271 jsr166 1.6 timer.finish();
272 jsr166 1.12 reallyAssert(sum == size);
273 dl 1.4 checkSum += sum;
274     return last;
275 dl 1.1 }
276    
277 dl 1.4 static void eitTest(Map s, int size) {
278 dl 1.1 int sum = 0;
279 dl 1.5 timer.start("Traverse entry ", size);
280 dl 1.4 for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
281     Map.Entry e = (Map.Entry)it.next();
282     Object k = e.getKey();
283     Object v = e.getValue();
284     if (k != null && k.getClass() == eclass &&
285     v != null && v.getClass() == eclass)
286     ++sum;
287     }
288 jsr166 1.6 timer.finish();
289 jsr166 1.12 reallyAssert(sum == size);
290 dl 1.4 checkSum += sum;
291 dl 1.1 }
292    
293 dl 1.4 static void itRemTest(Map s, int size) {
294     int sz = s.size();
295 jsr166 1.12 reallyAssert(sz == size);
296 dl 1.4 timer.start("Remove Present ", size);
297 dl 1.1 int sum = 0;
298 dl 1.4 for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
299     it.next();
300     it.remove();
301     ++sum;
302 dl 1.1 }
303 jsr166 1.6 timer.finish();
304 jsr166 1.12 reallyAssert(sum == sz);
305 dl 1.4 checkSum += sum;
306 dl 1.1 }
307    
308 dl 1.4 static void itHalfRemTest(Map s, int size) {
309     int sz = s.size();
310 jsr166 1.12 reallyAssert(sz == size);
311 dl 1.4 timer.start("Remove Present ", size);
312 dl 1.1 int sum = 0;
313     for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
314 dl 1.4 it.next();
315     it.remove();
316     if (it.hasNext())
317     it.next();
318     ++sum;
319 dl 1.1 }
320 jsr166 1.6 timer.finish();
321 jsr166 1.12 reallyAssert(sum == sz / 2);
322 dl 1.4 checkSum += sum;
323     }
324    
325     static void putAllTest(String nm, int n, Map src, Map dst) {
326     timer.start(nm, n);
327     dst.putAll(src);
328 jsr166 1.6 timer.finish();
329 jsr166 1.12 reallyAssert(src.size() == dst.size());
330 dl 1.4 }
331    
332     static void serTest(Map s, int size) throws Exception {
333 jsr166 1.6 if (!(s instanceof Serializable))
334 dl 1.4 return;
335     System.out.print("Serialize : ");
336 jsr166 1.6
337 dl 1.4 for (int i = 0; i < size; i++) {
338     s.put(new Integer(i), Boolean.TRUE);
339     }
340    
341     long startTime = System.currentTimeMillis();
342    
343     FileOutputStream fs = new FileOutputStream("MapCheck.dat");
344     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fs));
345     out.writeObject(s);
346     out.close();
347    
348     FileInputStream is = new FileInputStream("MapCheck.dat");
349     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(is));
350 jsr166 1.9 Map m = (Map) in.readObject();
351 dl 1.4
352     long endTime = System.currentTimeMillis();
353     long time = endTime - startTime;
354    
355     System.out.print(time + "ms");
356    
357     if (s instanceof IdentityHashMap) return;
358 jsr166 1.12 reallyAssert(s.equals(m));
359 dl 1.1 }
360    
361 dl 1.4 static void mainTest(Map s, Object[] key, Object[] absent) {
362     int size = key.length;
363    
364     putTest("Add Absent ", size, s, key, size);
365     reallyAssert(s.size() == size);
366     getTest("Access Present ", size, s, key, size);
367     getTest("Search Absent ", size, s, absent, 0);
368     kitTest(s, size);
369     vitTest(s, size);
370     eitTest(s, size);
371     putTest("Modify Present ", size, s, key, 0);
372     reallyAssert(s.size() == size);
373     untimedKeyTest("Access Present ", size, s, key, size);
374     keyTest("Search Absent ", size, s, absent, 0);
375     valTest(s, key);
376     remTest("Search Absent ", size, s, absent, 0);
377     reallyAssert(s.size() == size);
378     remHalfTest("Remove Present ", size, s, key, size / 2);
379     reallyAssert(s.size() == size / 2);
380     getTest("Access Present ", size, s, key, size / 2);
381     putTest("Add Absent ", size, s, key, size / 2);
382     reallyAssert(s.size() == size);
383     getTest("Access Present ", size, s, key, size);
384     getTest("Search Absent ", size, s, absent, 0);
385     itRemTest(s, size);
386     putTest("Add Absent ", size, s, key, size);
387     reallyAssert(s.size() == size);
388     getTest("Access Present ", size, s, key, size);
389     untimedKeyTest("Access Present ", size, s, key, size);
390     kitTest(s, size);
391     vitTest(s, size);
392     eitTest(s, size);
393 jsr166 1.6 twoMapTest1(s, key, absent);
394 dl 1.4 twoMapTest2(s, key, absent);
395     }
396    
397     static void twoMapTest1(Map s, Object[] key, Object[] absent) {
398     int size = s.size();
399     Map s2 = newMap();
400     putAllTest("Add Absent ", size, s, s2);
401     getTest("Access Present ", size, s2, key, size);
402     itHalfRemTest(s2, size);
403     reallyAssert(s2.size() == size / 2);
404     itHalfRemTest(s2, size / 2);
405     reallyAssert(s2.size() == size / 4);
406     putTest("Add Absent ", size, s2, absent, size);
407     putTest("Add Absent ", size, s2, key, size * 3 / 4);
408     reallyAssert(s2.size() == size * 2);
409     clrTest(size, s2);
410 jsr166 1.6 }
411 dl 1.4
412     static void twoMapTest2(Map s, Object[] key, Object[] absent) {
413     int size = key.length;
414    
415     Map s2 = newMap();
416     putAllTest("Add Absent ", size, s, s2);
417     putAllTest("Modify Present ", size, s, s2);
418    
419     Object lastkey = kitTest(s2, size);
420     Object hold = s2.get(lastkey);
421 dl 1.1 int sum = 0;
422 dl 1.4
423 dl 1.5 timer.start("Traverse entry ", size * 12); // 12 until finish
424 dl 1.4
425     int sh1 = s.hashCode() - s2.hashCode();
426 jsr166 1.12 reallyAssert(sh1 == 0);
427 dl 1.4
428     boolean eq1 = s2.equals(s);
429     boolean eq2 = s.equals(s2);
430 jsr166 1.12 reallyAssert(eq1 && eq2);
431 dl 1.4
432     Set es2 = s2.entrySet();
433     for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
434     Object entry = it.next();
435     if (es2.contains(entry)) ++sum;
436 dl 1.1 }
437 jsr166 1.12 reallyAssert(sum == size);
438 dl 1.4
439     s2.put(lastkey, MISSING);
440    
441     int sh2 = s.hashCode() - s2.hashCode();
442 jsr166 1.12 reallyAssert(sh2 != 0);
443 dl 1.4
444     eq1 = s2.equals(s);
445     eq2 = s.equals(s2);
446 jsr166 1.12 reallyAssert(!eq1 && !eq2);
447 dl 1.4
448     sum = 0;
449 dl 1.1 for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
450 dl 1.3 Map.Entry e = (Map.Entry)it.next();
451 dl 1.4 e.setValue(absent[sum++]);
452     }
453 jsr166 1.12 reallyAssert(sum == size);
454 dl 1.4 for (Iterator it = s2.entrySet().iterator(); it.hasNext(); ) {
455     Map.Entry e = (Map.Entry)it.next();
456     e.setValue(s.get(e.getKey()));
457     }
458    
459 jsr166 1.6 timer.finish();
460 dl 1.4
461     int rmiss = 0;
462     timer.start("Remove Present ", size * 2);
463     Iterator s2i = s2.entrySet().iterator();
464     Set es = s.entrySet();
465     while (s2i.hasNext()) {
466     if (!es.remove(s2i.next()))
467     ++rmiss;
468 dl 1.1 }
469 jsr166 1.6 timer.finish();
470 dl 1.4 reallyAssert(rmiss == 0);
471    
472     clrTest(size, s2);
473 jsr166 1.12 reallyAssert(s2.isEmpty() && s.isEmpty());
474 dl 1.1 }
475    
476 dl 1.4 static void itTest4(Map s, int size, int pos) {
477 dl 1.1 IdentityHashMap seen = new IdentityHashMap(size);
478 jsr166 1.12 reallyAssert(s.size() == size);
479 dl 1.1 int sum = 0;
480     timer.start("Iter XEntry ", size);
481 jsr166 1.6 Iterator it = s.entrySet().iterator();
482 dl 1.1 Object k = null;
483     Object v = null;
484     for (int i = 0; i < size-pos; ++i) {
485     Map.Entry x = (Map.Entry)(it.next());
486     k = x.getKey();
487     v = x.getValue();
488     seen.put(k, k);
489     if (x != MISSING)
490     ++sum;
491     }
492 jsr166 1.12 reallyAssert(s.containsKey(k));
493 dl 1.1 it.remove();
494 jsr166 1.12 reallyAssert(!s.containsKey(k));
495 dl 1.1 while (it.hasNext()) {
496     Map.Entry x = (Map.Entry)(it.next());
497     Object k2 = x.getKey();
498     seen.put(k2, k2);
499     if (x != MISSING)
500     ++sum;
501     }
502    
503 jsr166 1.12 reallyAssert(s.size() == size-1);
504 dl 1.1 s.put(k, v);
505 jsr166 1.12 reallyAssert(seen.size() == size);
506 jsr166 1.6 timer.finish();
507 jsr166 1.12 reallyAssert(sum == size);
508     reallyAssert(s.size() == size);
509 dl 1.1 }
510    
511 dl 1.4 static void initializeKeys(Object[] key, Object[] absent, int size) {
512     if (eclass == Object.class) {
513     for (int i = 0; i < size; ++i) key[i] = new Object();
514     for (int i = 0; i < size; ++i) absent[i] = new Object();
515     }
516     else if (eclass == Integer.class) {
517     initInts(key, absent, size);
518     }
519     else if (eclass == Float.class) {
520     initFloats(key, absent, size);
521     }
522 dl 1.5 else if (eclass == Double.class) {
523     initDoubles(key, absent, size);
524     }
525 dl 1.4 else if (eclass == String.class) {
526     initWords(size, key, absent);
527     }
528 jsr166 1.6 else
529 dl 1.4 throw new Error("unknown type");
530     }
531    
532     static void initInts(Object[] key, Object[] absent, int size) {
533 jsr166 1.6 for (int i = 0; i < size; ++i)
534 dl 1.4 key[i] = Integer.valueOf(i);
535     Map m = newMap();
536     int k = 0;
537     while (k < size) {
538     int r = srng.next();
539     if (r < 0 || r >= size) {
540     Integer ir = Integer.valueOf(r);
541     if (m.put(ir, ir) == null)
542     absent[k++] = ir;
543     }
544 dl 1.1 }
545     }
546    
547 dl 1.4 static void initFloats(Object[] key, Object[] absent, int size) {
548     Map m = newMap();
549 dl 1.1 for (int i = 0; i < size; ++i) {
550 dl 1.4 float r = Float.valueOf(i);
551     key[i] = r;
552     m.put(r, r);
553 dl 1.1 }
554 dl 1.4 int k = 0;
555     while (k < size) {
556     float r = rng.nextFloat();
557     Float ir = Float.valueOf(r);
558     if (m.put(ir, ir) == null)
559     absent[k++] = ir;
560 dl 1.1 }
561     }
562    
563 dl 1.5 static void initDoubles(Object[] key, Object[] absent, int size) {
564     Map m = newMap();
565     for (int i = 0; i < size; ++i) {
566     double r = Double.valueOf(i);
567     key[i] = r;
568     m.put(r, r);
569     }
570     int k = 0;
571     while (k < size) {
572     double r = rng.nextDouble();
573     Double ir = Double.valueOf(r);
574     if (m.put(ir, ir) == null)
575     absent[k++] = ir;
576     }
577     }
578    
579 dl 1.4 // Use as many real words as possible, then use fake random words
580 dl 1.1
581 dl 1.4 static void initWords(int size, Object[] key, Object[] abs) {
582     String fileName = "testwords.txt";
583     int ki = 0;
584     int ai = 0;
585     try {
586     FileInputStream fr = new FileInputStream(fileName);
587     BufferedInputStream in = new BufferedInputStream(fr);
588     while (ki < size || ai < size) {
589     StringBuffer sb = new StringBuffer();
590     for (;;) {
591     int c = in.read();
592     if (c < 0) {
593 jsr166 1.6 if (ki < size)
594 dl 1.4 randomWords(key, ki, size);
595     if (ai < size)
596     randomWords(abs, ai, size);
597     in.close();
598     return;
599     }
600     if (c == '\n') {
601     String s = sb.toString();
602     if (ki < size)
603     key[ki++] = s;
604     else
605     abs[ai++] = s;
606     break;
607     }
608 jsr166 1.11 sb.append((char) c);
609 dl 1.4 }
610     }
611     in.close();
612 dl 1.1 }
613 dl 1.4 catch (IOException ex) {
614     System.out.println("Can't read words file:" + ex);
615     throw new Error(ex);
616 dl 1.1 }
617     }
618    
619 dl 1.4 static void randomWords(Object[] ws, int origin, int size) {
620     for (int i = origin; i < size; ++i) {
621     int k = 0;
622     int len = 2 + (srng.next() & 0xf);
623     char[] c = new char[len * 4 + 1];
624     for (int j = 1; j < len; ++j) {
625     int r = srng.next();
626 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
627 dl 1.4 r >>>= 8;
628 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
629 dl 1.4 r >>>= 8;
630 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
631 dl 1.4 r >>>= 8;
632 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
633 dl 1.4 }
634 jsr166 1.11 c[k++] = (char) ((i & 31) | 1); // never == to any testword
635 dl 1.4 ws[i] = new String(c);
636 dl 1.1 }
637     }
638    
639 dl 1.4 static final class TestTimer {
640 dl 1.1 private String name;
641     private long numOps;
642     private long startTime;
643    
644     static final java.util.TreeMap accum = new java.util.TreeMap();
645 jsr166 1.6
646 dl 1.1 static void printStats() {
647     for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
648 jsr166 1.9 Map.Entry e = (Map.Entry) it.next();
649     Stats stats = (Stats) e.getValue();
650 dl 1.4 System.out.print(e.getKey() + ": ");
651     long s;
652     long n = stats.number;
653     if (n == 0) {
654     n = stats.firstn;
655     s = stats.first;
656     }
657 jsr166 1.6 else
658 dl 1.4 s = stats.sum;
659 jsr166 1.6
660 jsr166 1.11 double t = ((double) s) / n;
661 dl 1.4 long nano = Math.round(t);
662     System.out.printf("%6d", + nano);
663     System.out.println();
664 dl 1.1 }
665     }
666 jsr166 1.6
667 dl 1.1 void start(String name, long numOps) {
668     this.name = name;
669     this.numOps = numOps;
670 dl 1.4 startTime = System.nanoTime();
671 dl 1.1 }
672    
673     void finish() {
674 dl 1.4 long elapsed = System.nanoTime() - startTime;
675 dl 1.1 Object st = accum.get(name);
676     if (st == null)
677 dl 1.4 accum.put(name, new Stats(elapsed, numOps));
678 jsr166 1.6 else
679 jsr166 1.9 ((Stats) st).addTime(elapsed, numOps);
680 dl 1.1 }
681    
682     }
683    
684 dl 1.4 static final class Stats {
685     long sum;
686     long number;
687     long first;
688     long firstn;
689 jsr166 1.6 Stats(long t, long n) {
690     first = t;
691 dl 1.4 firstn = n;
692     }
693     void addTime(long t, long n) {
694     sum += t;
695     number += n;
696     }
697 dl 1.1 }
698    
699     static void shuffle(Object[] keys) {
700     int size = keys.length;
701 jsr166 1.15 for (int i = size; i > 1; i--) {
702 dl 1.1 int r = rng.nextInt(i);
703     Object t = keys[i-1];
704     keys[i-1] = keys[r];
705     keys[r] = t;
706     }
707     }
708    
709 dl 1.4 static void shuffle(ArrayList keys) {
710     int size = keys.size();
711 jsr166 1.15 for (int i = size; i > 1; i--) {
712 dl 1.4 int r = rng.nextInt(i);
713     Object t = keys.get(i-1);
714     keys.set(i-1, keys.get(r));
715     keys.set(r, t);
716     }
717     }
718    
719 dl 1.1 }