ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/MapCheck.java
Revision: 1.15
Committed: Tue Jan 22 20:31:05 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.14: +2 -2 lines
Log Message:
whitespace

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     import java.util.*;
16     import java.io.*;
17    
18     public class MapCheck {
19 dl 1.4 static final Object MISSING = new Object();
20     static TestTimer timer = new TestTimer();
21     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.8 return (Map) mapClass.newInstance();
103     } 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
147     static void getTest(String nm, int n, Map s, Object[] key, int expect) {
148 dl 1.1 int sum = 0;
149 dl 1.4 timer.start(nm, n);
150     for (int i = 0; i < n; i++) {
151     Object v = s.get(key[i]);
152     if (v != null && v.getClass() == eclass)
153     ++sum;
154     }
155 jsr166 1.6 timer.finish();
156 jsr166 1.12 reallyAssert(sum == expect);
157 dl 1.4 checkSum += sum;
158 dl 1.1 }
159    
160    
161 dl 1.4 // unused
162     static void getTestBoxed(String nm, int n, Map s, Object[] key, int expect) {
163 dl 1.1 int sum = 0;
164 dl 1.4 Map<Integer,Integer> intMap = (Map<Integer,Integer>)s;
165     timer.start(nm, n);
166     for (int i = 0; i < n; i++) {
167 jsr166 1.10 if (intMap.get(i) != i) ++sum;
168 dl 1.1 }
169 jsr166 1.6 timer.finish();
170 jsr166 1.12 reallyAssert(sum == expect);
171 dl 1.1 }
172    
173 dl 1.4 static void remTest(String nm, int n, Map s, Object[] key, int expect) {
174 dl 1.1 int sum = 0;
175     timer.start(nm, n);
176     for (int i = 0; i < n; i++) {
177     if (s.remove(key[i]) != null) ++sum;
178     }
179 jsr166 1.6 timer.finish();
180 jsr166 1.12 reallyAssert(sum == expect);
181 dl 1.4 checkSum += sum;
182     }
183    
184     static void clrTest(int n, Map s) {
185     String nm = "Remove Present ";
186     timer.start(nm, n);
187     s.clear();
188 jsr166 1.6 timer.finish();
189 jsr166 1.12 reallyAssert(s.isEmpty());
190 dl 1.1 }
191    
192 dl 1.4 static void putTest(String nm, int n, Map s, Object[] key, int expect) {
193 dl 1.1 int sum = 0;
194     timer.start(nm, n);
195     for (int i = 0; i < n; i++) {
196 dl 1.4 Object k = key[i];
197     Object v = s.put(k, k);
198     if (v == null) ++sum;
199 dl 1.1 }
200 jsr166 1.6 timer.finish();
201 jsr166 1.12 reallyAssert(sum == expect);
202 dl 1.4 checkSum += sum;
203 dl 1.1 }
204    
205 dl 1.4 static void keyTest(String nm, int n, Map s, Object[] key, int expect) {
206 dl 1.1 int sum = 0;
207     timer.start(nm, n);
208     for (int i = 0; i < n; i++) {
209     if (s.containsKey(key[i])) ++sum;
210     }
211 jsr166 1.6 timer.finish();
212 jsr166 1.12 reallyAssert(sum == expect);
213 dl 1.4 checkSum += sum;
214     }
215    
216     // version without timing for uncategorized tests
217     static void untimedKeyTest(String nm, int n, Map s, Object[] key, int expect) {
218     int sum = 0;
219     for (int i = 0; i < n; i++) {
220     if (s.containsKey(key[i])) ++sum;
221     }
222 jsr166 1.12 reallyAssert(sum == expect);
223 dl 1.4 checkSum += sum;
224 dl 1.1 }
225    
226 dl 1.4 static void remHalfTest(String nm, int n, Map s, Object[] key, int expect) {
227 dl 1.1 int sum = 0;
228     timer.start(nm, n/2);
229     for (int i = n-2; i >= 0; i-=2) {
230     if (s.remove(key[i]) != null) ++sum;
231     }
232 jsr166 1.6 timer.finish();
233 jsr166 1.12 reallyAssert(sum == expect);
234 dl 1.4 checkSum += sum;
235 dl 1.1 }
236    
237 dl 1.4 static void valTest(Map s, Object[] key) {
238     int size = s.size();
239 dl 1.1 int sum = 0;
240 dl 1.5 timer.start("Traverse key or value ", size);
241 dl 1.4 if (s.containsValue(MISSING)) ++sum;
242 jsr166 1.6 timer.finish();
243 jsr166 1.12 reallyAssert(sum == 0);
244 dl 1.4 checkSum += sum;
245 dl 1.1 }
246    
247 dl 1.4
248     static Object kitTest(Map s, int size) {
249     Object last = null;
250 dl 1.1 int sum = 0;
251 dl 1.5 timer.start("Traverse key or value ", size);
252 dl 1.4 for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
253     Object x = it.next();
254     if (x != last && x != null && x.getClass() == eclass)
255     ++sum;
256     last = x;
257 dl 1.1 }
258 jsr166 1.6 timer.finish();
259 jsr166 1.12 reallyAssert(sum == size);
260 dl 1.4 checkSum += sum;
261     return last;
262 dl 1.1 }
263    
264 dl 1.4 static Object vitTest(Map s, int size) {
265     Object last = null;
266 dl 1.1 int sum = 0;
267 dl 1.5 timer.start("Traverse key or value ", size);
268 dl 1.4 for (Iterator it = s.values().iterator(); it.hasNext(); ) {
269     Object x = it.next();
270     if (x != last && x != null && x.getClass() == eclass)
271     ++sum;
272     last = x;
273 dl 1.1 }
274 jsr166 1.6 timer.finish();
275 jsr166 1.12 reallyAssert(sum == size);
276 dl 1.4 checkSum += sum;
277     return last;
278 dl 1.1 }
279    
280 dl 1.4 static void eitTest(Map s, int size) {
281 dl 1.1 int sum = 0;
282 dl 1.5 timer.start("Traverse entry ", size);
283 dl 1.4 for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
284     Map.Entry e = (Map.Entry)it.next();
285     Object k = e.getKey();
286     Object v = e.getValue();
287     if (k != null && k.getClass() == eclass &&
288     v != null && v.getClass() == eclass)
289     ++sum;
290     }
291 jsr166 1.6 timer.finish();
292 jsr166 1.12 reallyAssert(sum == size);
293 dl 1.4 checkSum += sum;
294 dl 1.1 }
295    
296 dl 1.4 static void itRemTest(Map s, int size) {
297     int sz = s.size();
298 jsr166 1.12 reallyAssert(sz == size);
299 dl 1.4 timer.start("Remove Present ", size);
300 dl 1.1 int sum = 0;
301 dl 1.4 for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
302     it.next();
303     it.remove();
304     ++sum;
305 dl 1.1 }
306 jsr166 1.6 timer.finish();
307 jsr166 1.12 reallyAssert(sum == sz);
308 dl 1.4 checkSum += sum;
309 dl 1.1 }
310    
311 dl 1.4 static void itHalfRemTest(Map s, int size) {
312     int sz = s.size();
313 jsr166 1.12 reallyAssert(sz == size);
314 dl 1.4 timer.start("Remove Present ", size);
315 dl 1.1 int sum = 0;
316     for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
317 dl 1.4 it.next();
318     it.remove();
319     if (it.hasNext())
320     it.next();
321     ++sum;
322 dl 1.1 }
323 jsr166 1.6 timer.finish();
324 jsr166 1.12 reallyAssert(sum == sz / 2);
325 dl 1.4 checkSum += sum;
326     }
327    
328     static void putAllTest(String nm, int n, Map src, Map dst) {
329     timer.start(nm, n);
330     dst.putAll(src);
331 jsr166 1.6 timer.finish();
332 jsr166 1.12 reallyAssert(src.size() == dst.size());
333 dl 1.4 }
334    
335     static void serTest(Map s, int size) throws Exception {
336 jsr166 1.6 if (!(s instanceof Serializable))
337 dl 1.4 return;
338     System.out.print("Serialize : ");
339 jsr166 1.6
340 dl 1.4 for (int i = 0; i < size; i++) {
341     s.put(new Integer(i), Boolean.TRUE);
342     }
343    
344     long startTime = System.currentTimeMillis();
345    
346     FileOutputStream fs = new FileOutputStream("MapCheck.dat");
347     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fs));
348     out.writeObject(s);
349     out.close();
350    
351     FileInputStream is = new FileInputStream("MapCheck.dat");
352     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(is));
353 jsr166 1.9 Map m = (Map) in.readObject();
354 dl 1.4
355     long endTime = System.currentTimeMillis();
356     long time = endTime - startTime;
357    
358     System.out.print(time + "ms");
359    
360     if (s instanceof IdentityHashMap) return;
361 jsr166 1.12 reallyAssert(s.equals(m));
362 dl 1.1 }
363    
364 dl 1.4 static void mainTest(Map s, Object[] key, Object[] absent) {
365     int size = key.length;
366    
367     putTest("Add Absent ", size, s, key, size);
368     reallyAssert(s.size() == size);
369     getTest("Access Present ", size, s, key, size);
370     getTest("Search Absent ", size, s, absent, 0);
371     kitTest(s, size);
372     vitTest(s, size);
373     eitTest(s, size);
374     putTest("Modify Present ", size, s, key, 0);
375     reallyAssert(s.size() == size);
376     untimedKeyTest("Access Present ", size, s, key, size);
377     keyTest("Search Absent ", size, s, absent, 0);
378     valTest(s, key);
379     remTest("Search Absent ", size, s, absent, 0);
380     reallyAssert(s.size() == size);
381     remHalfTest("Remove Present ", size, s, key, size / 2);
382     reallyAssert(s.size() == size / 2);
383     getTest("Access Present ", size, s, key, size / 2);
384     putTest("Add Absent ", size, s, key, size / 2);
385     reallyAssert(s.size() == size);
386     getTest("Access Present ", size, s, key, size);
387     getTest("Search Absent ", size, s, absent, 0);
388     itRemTest(s, size);
389     putTest("Add Absent ", size, s, key, size);
390     reallyAssert(s.size() == size);
391     getTest("Access Present ", size, s, key, size);
392     untimedKeyTest("Access Present ", size, s, key, size);
393     kitTest(s, size);
394     vitTest(s, size);
395     eitTest(s, size);
396 jsr166 1.6 twoMapTest1(s, key, absent);
397 dl 1.4 twoMapTest2(s, key, absent);
398     }
399    
400     static void twoMapTest1(Map s, Object[] key, Object[] absent) {
401     int size = s.size();
402     Map s2 = newMap();
403     putAllTest("Add Absent ", size, s, s2);
404     getTest("Access Present ", size, s2, key, size);
405     itHalfRemTest(s2, size);
406     reallyAssert(s2.size() == size / 2);
407     itHalfRemTest(s2, size / 2);
408     reallyAssert(s2.size() == size / 4);
409     putTest("Add Absent ", size, s2, absent, size);
410     putTest("Add Absent ", size, s2, key, size * 3 / 4);
411     reallyAssert(s2.size() == size * 2);
412     clrTest(size, s2);
413 jsr166 1.6 }
414 dl 1.4
415     static void twoMapTest2(Map s, Object[] key, Object[] absent) {
416     int size = key.length;
417    
418     Map s2 = newMap();
419     putAllTest("Add Absent ", size, s, s2);
420     putAllTest("Modify Present ", size, s, s2);
421    
422     Object lastkey = kitTest(s2, size);
423     Object hold = s2.get(lastkey);
424 dl 1.1 int sum = 0;
425 dl 1.4
426 dl 1.5 timer.start("Traverse entry ", size * 12); // 12 until finish
427 dl 1.4
428     int sh1 = s.hashCode() - s2.hashCode();
429 jsr166 1.12 reallyAssert(sh1 == 0);
430 dl 1.4
431     boolean eq1 = s2.equals(s);
432     boolean eq2 = s.equals(s2);
433 jsr166 1.12 reallyAssert(eq1 && eq2);
434 dl 1.4
435     Set es2 = s2.entrySet();
436     for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
437     Object entry = it.next();
438     if (es2.contains(entry)) ++sum;
439 dl 1.1 }
440 jsr166 1.12 reallyAssert(sum == size);
441 dl 1.4
442     s2.put(lastkey, MISSING);
443    
444     int sh2 = s.hashCode() - s2.hashCode();
445 jsr166 1.12 reallyAssert(sh2 != 0);
446 dl 1.4
447     eq1 = s2.equals(s);
448     eq2 = s.equals(s2);
449 jsr166 1.12 reallyAssert(!eq1 && !eq2);
450 dl 1.4
451     sum = 0;
452 dl 1.1 for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
453 dl 1.3 Map.Entry e = (Map.Entry)it.next();
454 dl 1.4 e.setValue(absent[sum++]);
455     }
456 jsr166 1.12 reallyAssert(sum == size);
457 dl 1.4 for (Iterator it = s2.entrySet().iterator(); it.hasNext(); ) {
458     Map.Entry e = (Map.Entry)it.next();
459     e.setValue(s.get(e.getKey()));
460     }
461    
462 jsr166 1.6 timer.finish();
463 dl 1.4
464     int rmiss = 0;
465     timer.start("Remove Present ", size * 2);
466     Iterator s2i = s2.entrySet().iterator();
467     Set es = s.entrySet();
468     while (s2i.hasNext()) {
469     if (!es.remove(s2i.next()))
470     ++rmiss;
471 dl 1.1 }
472 jsr166 1.6 timer.finish();
473 dl 1.4 reallyAssert(rmiss == 0);
474    
475     clrTest(size, s2);
476 jsr166 1.12 reallyAssert(s2.isEmpty() && s.isEmpty());
477 dl 1.1 }
478    
479 dl 1.4 static void itTest4(Map s, int size, int pos) {
480 dl 1.1 IdentityHashMap seen = new IdentityHashMap(size);
481 jsr166 1.12 reallyAssert(s.size() == size);
482 dl 1.1 int sum = 0;
483     timer.start("Iter XEntry ", size);
484 jsr166 1.6 Iterator it = s.entrySet().iterator();
485 dl 1.1 Object k = null;
486     Object v = null;
487     for (int i = 0; i < size-pos; ++i) {
488     Map.Entry x = (Map.Entry)(it.next());
489     k = x.getKey();
490     v = x.getValue();
491     seen.put(k, k);
492     if (x != MISSING)
493     ++sum;
494     }
495 jsr166 1.12 reallyAssert(s.containsKey(k));
496 dl 1.1 it.remove();
497 jsr166 1.12 reallyAssert(!s.containsKey(k));
498 dl 1.1 while (it.hasNext()) {
499     Map.Entry x = (Map.Entry)(it.next());
500     Object k2 = x.getKey();
501     seen.put(k2, k2);
502     if (x != MISSING)
503     ++sum;
504     }
505    
506 jsr166 1.12 reallyAssert(s.size() == size-1);
507 dl 1.1 s.put(k, v);
508 jsr166 1.12 reallyAssert(seen.size() == size);
509 jsr166 1.6 timer.finish();
510 jsr166 1.12 reallyAssert(sum == size);
511     reallyAssert(s.size() == size);
512 dl 1.1 }
513    
514    
515    
516 dl 1.4 static void initializeKeys(Object[] key, Object[] absent, int size) {
517     if (eclass == Object.class) {
518     for (int i = 0; i < size; ++i) key[i] = new Object();
519     for (int i = 0; i < size; ++i) absent[i] = new Object();
520     }
521     else if (eclass == Integer.class) {
522     initInts(key, absent, size);
523     }
524     else if (eclass == Float.class) {
525     initFloats(key, absent, size);
526     }
527 dl 1.5 else if (eclass == Double.class) {
528     initDoubles(key, absent, size);
529     }
530 dl 1.4 else if (eclass == String.class) {
531     initWords(size, key, absent);
532     }
533 jsr166 1.6 else
534 dl 1.4 throw new Error("unknown type");
535     }
536    
537     static void initInts(Object[] key, Object[] absent, int size) {
538 jsr166 1.6 for (int i = 0; i < size; ++i)
539 dl 1.4 key[i] = Integer.valueOf(i);
540     Map m = newMap();
541     int k = 0;
542     while (k < size) {
543     int r = srng.next();
544     if (r < 0 || r >= size) {
545     Integer ir = Integer.valueOf(r);
546     if (m.put(ir, ir) == null)
547     absent[k++] = ir;
548     }
549 dl 1.1 }
550     }
551    
552 dl 1.4 static void initFloats(Object[] key, Object[] absent, int size) {
553     Map m = newMap();
554 dl 1.1 for (int i = 0; i < size; ++i) {
555 dl 1.4 float r = Float.valueOf(i);
556     key[i] = r;
557     m.put(r, r);
558 dl 1.1 }
559 dl 1.4 int k = 0;
560     while (k < size) {
561     float r = rng.nextFloat();
562     Float ir = Float.valueOf(r);
563     if (m.put(ir, ir) == null)
564     absent[k++] = ir;
565 dl 1.1 }
566     }
567    
568 dl 1.5 static void initDoubles(Object[] key, Object[] absent, int size) {
569     Map m = newMap();
570     for (int i = 0; i < size; ++i) {
571     double r = Double.valueOf(i);
572     key[i] = r;
573     m.put(r, r);
574     }
575     int k = 0;
576     while (k < size) {
577     double r = rng.nextDouble();
578     Double ir = Double.valueOf(r);
579     if (m.put(ir, ir) == null)
580     absent[k++] = ir;
581     }
582     }
583    
584 dl 1.4 // Use as many real words as possible, then use fake random words
585 dl 1.1
586 dl 1.4 static void initWords(int size, Object[] key, Object[] abs) {
587     String fileName = "testwords.txt";
588     int ki = 0;
589     int ai = 0;
590     try {
591     FileInputStream fr = new FileInputStream(fileName);
592     BufferedInputStream in = new BufferedInputStream(fr);
593     while (ki < size || ai < size) {
594     StringBuffer sb = new StringBuffer();
595     for (;;) {
596     int c = in.read();
597     if (c < 0) {
598 jsr166 1.6 if (ki < size)
599 dl 1.4 randomWords(key, ki, size);
600     if (ai < size)
601     randomWords(abs, ai, size);
602     in.close();
603     return;
604     }
605     if (c == '\n') {
606     String s = sb.toString();
607     if (ki < size)
608     key[ki++] = s;
609     else
610     abs[ai++] = s;
611     break;
612     }
613 jsr166 1.11 sb.append((char) c);
614 dl 1.4 }
615     }
616     in.close();
617 dl 1.1 }
618 dl 1.4 catch (IOException ex) {
619     System.out.println("Can't read words file:" + ex);
620     throw new Error(ex);
621 dl 1.1 }
622     }
623    
624    
625 dl 1.4 static void randomWords(Object[] ws, int origin, int size) {
626     for (int i = origin; i < size; ++i) {
627     int k = 0;
628     int len = 2 + (srng.next() & 0xf);
629     char[] c = new char[len * 4 + 1];
630     for (int j = 1; j < len; ++j) {
631     int r = srng.next();
632 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
633 dl 1.4 r >>>= 8;
634 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
635 dl 1.4 r >>>= 8;
636 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
637 dl 1.4 r >>>= 8;
638 jsr166 1.11 c[k++] = (char) (' ' + (r & 0x7f));
639 dl 1.4 }
640 jsr166 1.11 c[k++] = (char) ((i & 31) | 1); // never == to any testword
641 dl 1.4 ws[i] = new String(c);
642 dl 1.1 }
643     }
644    
645 dl 1.4 static final class TestTimer {
646 dl 1.1 private String name;
647     private long numOps;
648     private long startTime;
649    
650     static final java.util.TreeMap accum = new java.util.TreeMap();
651 jsr166 1.6
652 dl 1.1 static void printStats() {
653     for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
654 jsr166 1.9 Map.Entry e = (Map.Entry) it.next();
655     Stats stats = (Stats) e.getValue();
656 dl 1.4 System.out.print(e.getKey() + ": ");
657     long s;
658     long n = stats.number;
659     if (n == 0) {
660     n = stats.firstn;
661     s = stats.first;
662     }
663 jsr166 1.6 else
664 dl 1.4 s = stats.sum;
665 jsr166 1.6
666 jsr166 1.11 double t = ((double) s) / n;
667 dl 1.4 long nano = Math.round(t);
668     System.out.printf("%6d", + nano);
669     System.out.println();
670 dl 1.1 }
671     }
672 jsr166 1.6
673 dl 1.1 void start(String name, long numOps) {
674     this.name = name;
675     this.numOps = numOps;
676 dl 1.4 startTime = System.nanoTime();
677 dl 1.1 }
678    
679     void finish() {
680 dl 1.4 long elapsed = System.nanoTime() - startTime;
681 dl 1.1 Object st = accum.get(name);
682     if (st == null)
683 dl 1.4 accum.put(name, new Stats(elapsed, numOps));
684 jsr166 1.6 else
685 jsr166 1.9 ((Stats) st).addTime(elapsed, numOps);
686 dl 1.1 }
687    
688     }
689    
690 dl 1.4 static final class Stats {
691     long sum;
692     long number;
693     long first;
694     long firstn;
695 jsr166 1.6 Stats(long t, long n) {
696     first = t;
697 dl 1.4 firstn = n;
698     }
699     void addTime(long t, long n) {
700     sum += t;
701     number += n;
702     }
703 dl 1.1 }
704    
705    
706     static void shuffle(Object[] keys) {
707     int size = keys.length;
708 jsr166 1.15 for (int i = size; i > 1; i--) {
709 dl 1.1 int r = rng.nextInt(i);
710     Object t = keys[i-1];
711     keys[i-1] = keys[r];
712     keys[r] = t;
713     }
714     }
715    
716 dl 1.4 static void shuffle(ArrayList keys) {
717     int size = keys.size();
718 jsr166 1.15 for (int i = size; i > 1; i--) {
719 dl 1.4 int r = rng.nextInt(i);
720     Object t = keys.get(i-1);
721     keys.set(i-1, keys.get(r));
722     keys.set(r, t);
723     }
724     }
725    
726 dl 1.1 }