ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/IntMapCheck.java
Revision: 1.6
Committed: Mon Nov 2 23:51:32 2009 UTC (14 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +4 -4 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     * http://creativecommons.org/licenses/publicdomain
5     */
6 dl 1.1 /**
7     * @test
8     * @synopsis Times and checks basic map operations
9     */
10     import java.util.*;
11     import java.io.*;
12    
13     public class IntMapCheck {
14     static int absentSize;
15     static int absentMask;
16     static Integer[] absent;
17     static final Integer MISSING = new Integer(Integer.MIN_VALUE);
18     static TestTimer timer = new TestTimer();
19    
20     static void reallyAssert(boolean b) {
21     if (!b) throw new Error("Failed Assertion");
22     }
23    
24     public static void main(String[] args) throws Exception {
25     Class mapClass = java.util.concurrent.ConcurrentHashMap.class;
26     int numTests = 50;
27 dl 1.3 int size = 75000;
28 dl 1.1
29     if (args.length > 0) {
30     try {
31     mapClass = Class.forName(args[0]);
32 jsr166 1.5 } catch (ClassNotFoundException e) {
33 dl 1.1 throw new RuntimeException("Class " + args[0] + " not found.");
34     }
35     }
36    
37    
38 jsr166 1.4 if (args.length > 1)
39 dl 1.1 numTests = Integer.parseInt(args[1]);
40    
41 jsr166 1.4 if (args.length > 2)
42 dl 1.1 size = Integer.parseInt(args[2]);
43    
44     boolean doSerializeTest = args.length > 3;
45    
46     System.out.println("Testing " + mapClass.getName() + " trials: " + numTests + " size: " + size);
47    
48     absentSize = 4;
49 dl 1.3 while (absentSize < size) absentSize <<= 1;
50 dl 1.1 absentMask = absentSize-1;
51     absent = new Integer[absentSize];
52 jsr166 1.4 for (int i = 0; i < absentSize/2; ++i)
53 dl 1.3 absent[i] = Integer.valueOf(-i - 1);
54 jsr166 1.4 for (int i = absentSize/2; i < absentSize; ++i)
55 dl 1.3 absent[i] = Integer.valueOf(size + i + 1);
56 dl 1.1
57     Integer[] key = new Integer[size];
58 jsr166 1.4 for (int i = 0; i < size; ++i)
59 dl 1.3 key[i] = Integer.valueOf(i);
60 dl 1.1
61     for (int rep = 0; rep < numTests; ++rep) {
62     runTest(newMap(mapClass), key);
63 dl 1.3 if ((rep & 3) == 3 && rep < numTests - 1) {
64     shuffle(key);
65     // Thread.sleep(50);
66     }
67 dl 1.1 }
68    
69     TestTimer.printStats();
70    
71    
72     if (doSerializeTest)
73     stest(newMap(mapClass), size);
74     }
75    
76     static Map<Integer,Integer> newMap(Class cl) {
77     try {
78     Map m = (Map<Integer,Integer>)cl.newInstance();
79     return m;
80 jsr166 1.5 } catch (Exception e) {
81 dl 1.1 throw new RuntimeException("Can't instantiate " + cl + ": " + e);
82     }
83     }
84    
85    
86     static void runTest(Map<Integer,Integer> s, Integer[] key) {
87     int size = key.length;
88     long startTime = System.nanoTime();
89     test(s, key);
90     long time = System.nanoTime() - startTime;
91     }
92    
93 dl 1.3 static void t1(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect, int iters) {
94     int sum = 0;
95     timer.start(nm, n * iters);
96     for (int j = 0; j < iters; ++j) {
97     for (int i = 0; i < n; i++) {
98     if (s.get(key[i]) != null) ++sum;
99     }
100     }
101 jsr166 1.4 timer.finish();
102 dl 1.3 reallyAssert (sum == expect * iters);
103     }
104 dl 1.1
105 dl 1.3 static void t1Boxed(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
106 dl 1.1 int sum = 0;
107 dl 1.3 int iters = 8;
108 dl 1.1 timer.start(nm, n * iters);
109     for (int j = 0; j < iters; ++j) {
110     for (int i = 0; i < n; i++) {
111 jsr166 1.6 if ((Integer) (s.get(i)) != i) ++sum;
112 dl 1.1 }
113     }
114 jsr166 1.4 timer.finish();
115 dl 1.1 reallyAssert (sum == expect * iters);
116     }
117    
118 dl 1.3
119 dl 1.1 static void t2(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
120     int sum = 0;
121     timer.start(nm, n);
122     for (int i = 0; i < n; i++) {
123     if (s.remove(key[i]) != null) ++sum;
124     }
125 jsr166 1.4 timer.finish();
126 dl 1.1 reallyAssert (sum == expect);
127     }
128    
129     static void t3(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
130     int sum = 0;
131     timer.start(nm, n);
132     for (int i = 0; i < n; i++) {
133     Integer k = key[i];
134     Integer v = absent[i & absentMask];
135     if (s.put(k, v) == null) ++sum;
136     }
137 jsr166 1.4 timer.finish();
138 dl 1.1 reallyAssert (sum == expect);
139     }
140    
141     static void t4(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
142     int sum = 0;
143     timer.start(nm, n);
144     for (int i = 0; i < n; i++) {
145     if (s.containsKey(key[i])) ++sum;
146     }
147 jsr166 1.4 timer.finish();
148 dl 1.1 reallyAssert (sum == expect);
149     }
150    
151     static void t5(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
152     int sum = 0;
153     timer.start(nm, n/2);
154     for (int i = n-2; i >= 0; i-=2) {
155     if (s.remove(key[i]) != null) ++sum;
156     }
157 jsr166 1.4 timer.finish();
158 dl 1.1 reallyAssert (sum == expect);
159     }
160    
161     static void t6(String nm, int n, Map<Integer,Integer> s, Integer[] k1, Integer[] k2) {
162     int sum = 0;
163     timer.start(nm, n * 2);
164     for (int i = 0; i < n; i++) {
165     if (s.get(k1[i]) != null) ++sum;
166     if (s.get(k2[i & absentMask]) != null) ++sum;
167     }
168 jsr166 1.4 timer.finish();
169 dl 1.1 reallyAssert (sum == n);
170     }
171    
172     static void t7(String nm, int n, Map<Integer,Integer> s, Integer[] k1, Integer[] k2) {
173     int sum = 0;
174     timer.start(nm, n * 2);
175     for (int i = 0; i < n; i++) {
176     if (s.containsKey(k1[i])) ++sum;
177     if (s.containsKey(k2[i & absentMask])) ++sum;
178     }
179 jsr166 1.4 timer.finish();
180 dl 1.1 reallyAssert (sum == n);
181     }
182    
183     static void t8(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
184     int sum = 0;
185     timer.start(nm, n);
186     for (int i = 0; i < n; i++) {
187     if (s.get(key[i]) != null) ++sum;
188     }
189 jsr166 1.4 timer.finish();
190 dl 1.1 reallyAssert (sum == expect);
191     }
192    
193    
194     static void t9(Map<Integer,Integer> s) {
195     int sum = 0;
196     int iters = 20;
197     timer.start("ContainsValue (/n) ", iters * s.size());
198     int step = absentSize / iters;
199     for (int i = 0; i < absentSize; i += step)
200     if (s.containsValue(absent[i])) ++sum;
201 jsr166 1.4 timer.finish();
202 dl 1.1 reallyAssert (sum != 0);
203     }
204    
205    
206     static void ktest(Map<Integer,Integer> s, int size, Integer[] key) {
207     timer.start("ContainsKey ", size);
208     Set ks = s.keySet();
209     int sum = 0;
210     for (int i = 0; i < size; i++) {
211     if (ks.contains(key[i])) ++sum;
212     }
213 jsr166 1.4 timer.finish();
214 dl 1.1 reallyAssert (sum == size);
215     }
216    
217    
218     static void ittest1(Map<Integer,Integer> s, int size) {
219     int sum = 0;
220     timer.start("Iter Key ", size);
221     for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
222 jsr166 1.5 if (it.next() != MISSING)
223 dl 1.1 ++sum;
224     }
225 jsr166 1.4 timer.finish();
226     // if (sum != size)
227 dl 1.3 // System.out.println("iters " + sum + " size " + size);
228 dl 1.1 reallyAssert (sum == size);
229     }
230    
231     static void ittest2(Map<Integer,Integer> s, int size) {
232     int sum = 0;
233     timer.start("Iter Value ", size);
234     for (Iterator it = s.values().iterator(); it.hasNext(); ) {
235 jsr166 1.5 if (it.next() != MISSING)
236 dl 1.1 ++sum;
237     }
238 jsr166 1.4 timer.finish();
239     // if (sum != size)
240 dl 1.3 // System.out.println("iters " + sum + " size " + size);
241 dl 1.1 reallyAssert (sum == size);
242     }
243     static void ittest3(Map<Integer,Integer> s, int size) {
244     int sum = 0;
245     timer.start("Iter Entry ", size);
246     for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
247 jsr166 1.5 if (it.next() != MISSING)
248 dl 1.1 ++sum;
249     }
250 jsr166 1.4 timer.finish();
251 dl 1.1 reallyAssert (sum == size);
252     }
253    
254     static void ittest4(Map<Integer,Integer> s, int size, int pos) {
255     IdentityHashMap seen = new IdentityHashMap(size);
256     reallyAssert (s.size() == size);
257     int sum = 0;
258     timer.start("Iter XEntry ", size);
259 jsr166 1.4 Iterator it = s.entrySet().iterator();
260 dl 1.1 Integer k = null;
261     Integer v = null;
262     for (int i = 0; i < size-pos; ++i) {
263     Map.Entry<Integer,Integer> x = (Map.Entry<Integer,Integer>)(it.next());
264     k = x.getKey();
265     v = x.getValue();
266     seen.put(k, k);
267     if (v != MISSING)
268     ++sum;
269     }
270     reallyAssert (s.containsKey(k));
271     it.remove();
272     reallyAssert (!s.containsKey(k));
273     while (it.hasNext()) {
274     Map.Entry<Integer,Integer> x = (Map.Entry<Integer,Integer>)(it.next());
275 jsr166 1.6 Integer k2 = (Integer) x.getKey();
276 dl 1.1 seen.put(k2, k2);
277     if (k2 != MISSING)
278     ++sum;
279     }
280    
281     reallyAssert (s.size() == size-1);
282     s.put(k, v);
283     reallyAssert (seen.size() == size);
284 jsr166 1.4 timer.finish();
285 dl 1.1 reallyAssert (sum == size);
286     reallyAssert (s.size() == size);
287     }
288    
289    
290     static void ittest(Map<Integer,Integer> s, int size) {
291 dl 1.3 for (int i = 0; i < 4; ++i) {
292     ittest1(s, size);
293     ittest2(s, size);
294     ittest3(s, size);
295     }
296 jsr166 1.4 // for (int i = 0; i < size-1; ++i)
297 dl 1.1 // ittest4(s, size, i);
298     }
299    
300     static void entest1(Hashtable ht, int size) {
301     int sum = 0;
302    
303     timer.start("Iter Enumeration Key ", size);
304     for (Enumeration en = ht.keys(); en.hasMoreElements(); ) {
305     if (en.nextElement() != MISSING)
306     ++sum;
307     }
308 jsr166 1.4 timer.finish();
309 dl 1.1 reallyAssert (sum == size);
310     }
311    
312     static void entest2(Hashtable ht, int size) {
313     int sum = 0;
314     timer.start("Iter Enumeration Value ", size);
315     for (Enumeration en = ht.elements(); en.hasMoreElements(); ) {
316     if (en.nextElement() != MISSING)
317     ++sum;
318     }
319 jsr166 1.4 timer.finish();
320 dl 1.1 reallyAssert (sum == size);
321     }
322    
323    
324     static void entest3(Hashtable ht, int size) {
325     int sum = 0;
326    
327     timer.start("Iterf Enumeration Key ", size);
328 jsr166 1.4 Enumeration en = ht.keys();
329 dl 1.1 for (int i = 0; i < size; ++i) {
330     if (en.nextElement() != MISSING)
331     ++sum;
332     }
333 jsr166 1.4 timer.finish();
334 dl 1.1 reallyAssert (sum == size);
335     }
336    
337     static void entest4(Hashtable ht, int size) {
338     int sum = 0;
339     timer.start("Iterf Enumeration Value", size);
340 jsr166 1.4 Enumeration en = ht.elements();
341 dl 1.1 for (int i = 0; i < size; ++i) {
342     if (en.nextElement() != MISSING)
343     ++sum;
344     }
345 jsr166 1.4 timer.finish();
346 dl 1.1 reallyAssert (sum == size);
347     }
348    
349     static void entest(Map<Integer,Integer> s, int size) {
350     if (s instanceof Hashtable) {
351 jsr166 1.6 Hashtable ht = (Hashtable) s;
352 dl 1.1 // entest3(ht, size);
353     // entest4(ht, size);
354     entest1(ht, size);
355     entest2(ht, size);
356     entest1(ht, size);
357     entest2(ht, size);
358     entest1(ht, size);
359     entest2(ht, size);
360     }
361     }
362    
363     static void rtest(Map<Integer,Integer> s, int size) {
364     timer.start("Remove (iterator) ", size);
365     for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
366     it.next();
367     it.remove();
368     }
369 dl 1.3 reallyAssert(s.isEmpty());
370 jsr166 1.4 timer.finish();
371 dl 1.1 }
372    
373 dl 1.3 static void stest(Map<Integer,Integer> s, int size) throws Exception {
374 jsr166 1.4 if (!(s instanceof Serializable))
375 dl 1.3 return;
376     System.out.print("Serialize : ");
377 jsr166 1.4
378 dl 1.3 for (int i = 0; i < size; i++) {
379     s.put(Integer.valueOf(i), Integer.valueOf(1));
380 dl 1.1 }
381 dl 1.3
382     long startTime = System.nanoTime();
383    
384     FileOutputStream fs = new FileOutputStream("IntMapCheck.dat");
385     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fs));
386     out.writeObject(s);
387     out.close();
388    
389     FileInputStream is = new FileInputStream("IntMapCheck.dat");
390     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(is));
391     Map<Integer,Integer> m = (Map<Integer,Integer>)in.readObject();
392    
393     long endTime = System.nanoTime();
394     long time = endTime - startTime;
395    
396     System.out.print(time + "ms");
397    
398     if (s instanceof IdentityHashMap) return;
399     reallyAssert (s.equals(m));
400 dl 1.1 }
401    
402 jsr166 1.4
403 dl 1.3 static void test(Map<Integer,Integer> s, Integer[] key) {
404     int size = key.length;
405    
406     t3("Put (absent) ", size, s, key, size);
407     reallyAssert(s.size() == size);
408     t1("Get (present) ", size, s, key, size, 8);
409     t1Boxed("Get boxed (present) ", size, s, key, size);
410     ittest1(s, size);
411     t3("Put (present) ", size, s, key, 0);
412     reallyAssert(s.size() == size);
413     t7("ContainsKey ", size, s, key, absent);
414     t4("ContainsKey ", size, s, key, size);
415     ktest(s, size, key);
416     t4("ContainsKey ", absentSize, s, absent, 0);
417     t6("Get ", size, s, key, absent);
418     t1("Get (present) ", size, s, key, size, 8);
419     t1("Get (absent) ", absentSize, s, absent, 0, 1);
420     reallyAssert(s.size() == size);
421     t2("Remove (absent) ", absentSize, s, absent, 0);
422     reallyAssert(s.size() == size);
423     t5("Remove (present) ", size, s, key, size / 2);
424     reallyAssert(s.size() == size / 2);
425     t1("Get ", size, s, key, size / 2, 8);
426     ittest1(s, size / 2);
427     t3("Put (half present) ", size, s, key, size / 2);
428     reallyAssert(s.size() == size);
429     t1("Get (present) ", size, s, key, size, 4);
430    
431     entest(s, size);
432     t9(s);
433     reallyAssert(s.size() == size);
434     timer.start("Clear ", size);
435     s.clear();
436 jsr166 1.4 timer.finish();
437 dl 1.3 t1("Get (absent) ", size, s, key, 0, 1);
438     t4("ContainsKey ", size, s, key, 0);
439     t2("Remove (absent) ", size, s, key, 0);
440     t3("Put (presized) ", size, s, key, size);
441     t1("Get (present) ", size, s, key, size, 4);
442     reallyAssert(s.size() == size);
443     ittest(s, size);
444     rtest(s, size);
445     reallyAssert(s.size() == 0);
446     timer.start("Clear ", size);
447     s.clear();
448 jsr166 1.4 timer.finish();
449 dl 1.3 t3("Put (presized) ", size, s, key, size);
450 dl 1.1
451     timer.start("Put (putAll) ", size * 2);
452     Map<Integer,Integer> s2 = null;
453     try {
454     s2 = (Map<Integer,Integer>) (s.getClass().newInstance());
455     s2.putAll(s);
456     }
457     catch (Exception e) { e.printStackTrace(); return; }
458 jsr166 1.4 timer.finish();
459    
460 dl 1.1 timer.start("Iter Equals ", size * 2);
461     boolean eqt = s2.equals(s) && s.equals(s2);
462     reallyAssert (eqt);
463 jsr166 1.4 timer.finish();
464 dl 1.1
465     timer.start("Iter HashCode ", size * 2);
466     int shc = s.hashCode();
467     int s2hc = s2.hashCode();
468     reallyAssert (shc == s2hc);
469 jsr166 1.4 timer.finish();
470 dl 1.1
471 dl 1.3 timer.start("Put (present) ", size * 2);
472     s2.putAll(s);
473 jsr166 1.4 timer.finish();
474 dl 1.3
475 dl 1.1 timer.start("Put (present) ", size);
476 dl 1.3 int ipsum = 0;
477     for (Iterator i0 = s.entrySet().iterator(); i0.hasNext(); ) {
478     Map.Entry<Integer,Integer> me = (Map.Entry<Integer,Integer>)(i0.next());
479     if (s2.put(me.getKey(), me.getValue()) != null)
480     ++ipsum;
481     }
482     reallyAssert (ipsum == s.size());
483 jsr166 1.4 timer.finish();
484 dl 1.1
485     timer.start("Iter EntrySet contains ", size * 2);
486     Set es2 = s2.entrySet();
487     int sum = 0;
488     for (Iterator i1 = s.entrySet().iterator(); i1.hasNext(); ) {
489     Object entry = i1.next();
490     if (es2.contains(entry)) ++sum;
491     }
492 jsr166 1.4 timer.finish();
493 dl 1.1 reallyAssert (sum == size);
494    
495     Integer hold = s2.get(key[size-1]);
496     s2.put(key[size-1], absent[0]);
497     timer.start("Iter Equals ", size * 2);
498     eqt = s2.equals(s) && s.equals(s2);
499     reallyAssert (!eqt);
500 jsr166 1.4 timer.finish();
501 dl 1.1
502     timer.start("Iter HashCode ", size * 2);
503     int s1h = s.hashCode();
504     int s2h = s2.hashCode();
505     reallyAssert (s1h != s2h);
506 jsr166 1.4 timer.finish();
507 dl 1.1
508     s2.put(key[size-1], hold);
509 dl 1.3 timer.start("Remove (present) ", size * 2);
510 dl 1.1 Iterator s2i = s2.entrySet().iterator();
511     Set es = s.entrySet();
512     while (s2i.hasNext())
513     reallyAssert(es.remove(s2i.next()));
514 jsr166 1.4 timer.finish();
515 dl 1.1
516     reallyAssert (s.isEmpty());
517    
518     timer.start("Clear ", size);
519     s2.clear();
520 jsr166 1.4 timer.finish();
521 dl 1.1 reallyAssert (s2.isEmpty() && s.isEmpty());
522     }
523    
524     static class TestTimer {
525     private String name;
526     private long numOps;
527     private long startTime;
528     private String cname;
529    
530     static final java.util.TreeMap accum = new java.util.TreeMap();
531 jsr166 1.4
532 dl 1.1 static void printStats() {
533     for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
534     Map.Entry e = (Map.Entry)(it.next());
535 jsr166 1.6 Stats stats = ((Stats) (e.getValue()));
536 dl 1.1 long n = stats.number;
537     double t;
538 jsr166 1.4 if (n > 0)
539 dl 1.1 t = stats.sum / n;
540     else
541     t = stats.least;
542 dl 1.3 long nano = Math.round(t);
543 dl 1.1 System.out.println(e.getKey() + ": " + nano);
544     }
545     }
546 jsr166 1.4
547 dl 1.1 void start(String name, long numOps) {
548     this.name = name;
549     this.cname = classify();
550     this.numOps = numOps;
551     startTime = System.nanoTime();
552     }
553 jsr166 1.4
554 dl 1.1
555     String classify() {
556     if (name.startsWith("Get"))
557     return "Get ";
558     else if (name.startsWith("Put"))
559     return "Put ";
560     else if (name.startsWith("Remove"))
561     return "Remove ";
562     else if (name.startsWith("Iter"))
563     return "Iter ";
564 jsr166 1.4 else
565 dl 1.1 return null;
566     }
567    
568     void finish() {
569     long endTime = System.nanoTime();
570     long time = endTime - startTime;
571 dl 1.3 double timePerOp = ((double)time)/numOps;
572 dl 1.1
573     Object st = accum.get(name);
574     if (st == null)
575     accum.put(name, new Stats(timePerOp));
576     else {
577     Stats stats = (Stats) st;
578     stats.sum += timePerOp;
579     stats.number++;
580     if (timePerOp < stats.least) stats.least = timePerOp;
581     }
582    
583     if (cname != null) {
584     st = accum.get(cname);
585     if (st == null)
586     accum.put(cname, new Stats(timePerOp));
587     else {
588     Stats stats = (Stats) st;
589     stats.sum += timePerOp;
590     stats.number++;
591     if (timePerOp < stats.least) stats.least = timePerOp;
592     }
593     }
594    
595     }
596    
597     }
598    
599     static class Stats {
600     double sum = 0;
601     double least;
602     long number = 0;
603     Stats(double t) { least = t; }
604     }
605    
606 dl 1.3 static Random rng = new Random(3152688);
607 dl 1.1
608     static void shuffle(Integer[] keys) {
609     int size = keys.length;
610     for (int i=size; i>1; i--) {
611     int r = rng.nextInt(i);
612     Integer t = keys[i-1];
613     keys[i-1] = keys[r];
614     keys[r] = t;
615     }
616     }
617    
618     }