ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/IntMapCheck.java
Revision: 1.14
Committed: Thu Jan 15 18:34:19 2015 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.13: +0 -11 lines
Log Message:
delete extraneous blank lines

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