ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/IntMapCheck.java
Revision: 1.15
Committed: Sun Oct 23 03:03:23 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.14: +4 -4 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.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 jsr166 1.15 return (Map<Integer,Integer>) cl.getConstructor().newInstance();
77 jsr166 1.5 } catch (Exception e) {
78 dl 1.1 throw new RuntimeException("Can't instantiate " + cl + ": " + e);
79     }
80     }
81    
82     static void runTest(Map<Integer,Integer> s, Integer[] key) {
83     int size = key.length;
84     long startTime = System.nanoTime();
85     test(s, key);
86     long time = System.nanoTime() - startTime;
87     }
88    
89 dl 1.3 static void t1(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect, int iters) {
90     int sum = 0;
91     timer.start(nm, n * iters);
92     for (int j = 0; j < iters; ++j) {
93     for (int i = 0; i < n; i++) {
94     if (s.get(key[i]) != null) ++sum;
95     }
96     }
97 jsr166 1.4 timer.finish();
98 jsr166 1.9 reallyAssert(sum == expect * iters);
99 dl 1.3 }
100 dl 1.1
101 dl 1.3 static void t1Boxed(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
102 dl 1.1 int sum = 0;
103 dl 1.3 int iters = 8;
104 dl 1.1 timer.start(nm, n * iters);
105     for (int j = 0; j < iters; ++j) {
106     for (int i = 0; i < n; i++) {
107 jsr166 1.7 if (s.get(i) != i) ++sum;
108 dl 1.1 }
109     }
110 jsr166 1.4 timer.finish();
111 jsr166 1.9 reallyAssert(sum == expect * iters);
112 dl 1.1 }
113    
114     static void t2(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
115     int sum = 0;
116     timer.start(nm, n);
117     for (int i = 0; i < n; i++) {
118     if (s.remove(key[i]) != null) ++sum;
119     }
120 jsr166 1.4 timer.finish();
121 jsr166 1.9 reallyAssert(sum == expect);
122 dl 1.1 }
123    
124     static void t3(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
125     int sum = 0;
126     timer.start(nm, n);
127     for (int i = 0; i < n; i++) {
128     Integer k = key[i];
129     Integer v = absent[i & absentMask];
130     if (s.put(k, v) == null) ++sum;
131     }
132 jsr166 1.4 timer.finish();
133 jsr166 1.9 reallyAssert(sum == expect);
134 dl 1.1 }
135    
136     static void t4(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
137     int sum = 0;
138     timer.start(nm, n);
139     for (int i = 0; i < n; i++) {
140     if (s.containsKey(key[i])) ++sum;
141     }
142 jsr166 1.4 timer.finish();
143 jsr166 1.9 reallyAssert(sum == expect);
144 dl 1.1 }
145    
146     static void t5(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
147     int sum = 0;
148     timer.start(nm, n/2);
149     for (int i = n-2; i >= 0; i-=2) {
150     if (s.remove(key[i]) != null) ++sum;
151     }
152 jsr166 1.4 timer.finish();
153 jsr166 1.9 reallyAssert(sum == expect);
154 dl 1.1 }
155    
156     static void t6(String nm, int n, Map<Integer,Integer> s, Integer[] k1, Integer[] k2) {
157     int sum = 0;
158     timer.start(nm, n * 2);
159     for (int i = 0; i < n; i++) {
160     if (s.get(k1[i]) != null) ++sum;
161     if (s.get(k2[i & absentMask]) != null) ++sum;
162     }
163 jsr166 1.4 timer.finish();
164 jsr166 1.9 reallyAssert(sum == n);
165 dl 1.1 }
166    
167     static void t7(String nm, int n, Map<Integer,Integer> s, Integer[] k1, Integer[] k2) {
168     int sum = 0;
169     timer.start(nm, n * 2);
170     for (int i = 0; i < n; i++) {
171     if (s.containsKey(k1[i])) ++sum;
172     if (s.containsKey(k2[i & absentMask])) ++sum;
173     }
174 jsr166 1.4 timer.finish();
175 jsr166 1.9 reallyAssert(sum == n);
176 dl 1.1 }
177    
178     static void t8(String nm, int n, Map<Integer,Integer> s, Integer[] key, int expect) {
179     int sum = 0;
180     timer.start(nm, n);
181     for (int i = 0; i < n; i++) {
182     if (s.get(key[i]) != null) ++sum;
183     }
184 jsr166 1.4 timer.finish();
185 jsr166 1.9 reallyAssert(sum == expect);
186 dl 1.1 }
187    
188     static void t9(Map<Integer,Integer> s) {
189     int sum = 0;
190     int iters = 20;
191     timer.start("ContainsValue (/n) ", iters * s.size());
192     int step = absentSize / iters;
193     for (int i = 0; i < absentSize; i += step)
194     if (s.containsValue(absent[i])) ++sum;
195 jsr166 1.4 timer.finish();
196 jsr166 1.9 reallyAssert(sum != 0);
197 dl 1.1 }
198    
199     static void ktest(Map<Integer,Integer> s, int size, Integer[] key) {
200     timer.start("ContainsKey ", size);
201     Set ks = s.keySet();
202     int sum = 0;
203     for (int i = 0; i < size; i++) {
204     if (ks.contains(key[i])) ++sum;
205     }
206 jsr166 1.4 timer.finish();
207 jsr166 1.9 reallyAssert(sum == size);
208 dl 1.1 }
209    
210     static void ittest1(Map<Integer,Integer> s, int size) {
211     int sum = 0;
212     timer.start("Iter Key ", size);
213     for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
214 jsr166 1.5 if (it.next() != MISSING)
215 dl 1.1 ++sum;
216     }
217 jsr166 1.4 timer.finish();
218     // if (sum != size)
219 dl 1.3 // System.out.println("iters " + sum + " size " + size);
220 jsr166 1.9 reallyAssert(sum == size);
221 dl 1.1 }
222    
223     static void ittest2(Map<Integer,Integer> s, int size) {
224     int sum = 0;
225     timer.start("Iter Value ", size);
226     for (Iterator it = s.values().iterator(); it.hasNext(); ) {
227 jsr166 1.5 if (it.next() != MISSING)
228 dl 1.1 ++sum;
229     }
230 jsr166 1.4 timer.finish();
231     // if (sum != size)
232 dl 1.3 // System.out.println("iters " + sum + " size " + size);
233 jsr166 1.9 reallyAssert(sum == size);
234 dl 1.1 }
235     static void ittest3(Map<Integer,Integer> s, int size) {
236     int sum = 0;
237     timer.start("Iter Entry ", size);
238     for (Iterator it = s.entrySet().iterator(); it.hasNext(); ) {
239 jsr166 1.5 if (it.next() != MISSING)
240 dl 1.1 ++sum;
241     }
242 jsr166 1.4 timer.finish();
243 jsr166 1.9 reallyAssert(sum == size);
244 dl 1.1 }
245    
246     static void ittest4(Map<Integer,Integer> s, int size, int pos) {
247     IdentityHashMap seen = new IdentityHashMap(size);
248 jsr166 1.9 reallyAssert(s.size() == size);
249 dl 1.1 int sum = 0;
250     timer.start("Iter XEntry ", size);
251 jsr166 1.4 Iterator it = s.entrySet().iterator();
252 dl 1.1 Integer k = null;
253     Integer v = null;
254     for (int i = 0; i < size-pos; ++i) {
255     Map.Entry<Integer,Integer> x = (Map.Entry<Integer,Integer>)(it.next());
256     k = x.getKey();
257     v = x.getValue();
258     seen.put(k, k);
259     if (v != MISSING)
260     ++sum;
261     }
262 jsr166 1.9 reallyAssert(s.containsKey(k));
263 dl 1.1 it.remove();
264 jsr166 1.9 reallyAssert(!s.containsKey(k));
265 dl 1.1 while (it.hasNext()) {
266     Map.Entry<Integer,Integer> x = (Map.Entry<Integer,Integer>)(it.next());
267 jsr166 1.7 Integer k2 = x.getKey();
268 dl 1.1 seen.put(k2, k2);
269     if (k2 != MISSING)
270     ++sum;
271     }
272    
273 jsr166 1.9 reallyAssert(s.size() == size-1);
274 dl 1.1 s.put(k, v);
275 jsr166 1.9 reallyAssert(seen.size() == size);
276 jsr166 1.4 timer.finish();
277 jsr166 1.9 reallyAssert(sum == size);
278     reallyAssert(s.size() == size);
279 dl 1.1 }
280    
281     static void ittest(Map<Integer,Integer> s, int size) {
282 dl 1.3 for (int i = 0; i < 4; ++i) {
283     ittest1(s, size);
284     ittest2(s, size);
285     ittest3(s, size);
286     }
287 jsr166 1.4 // for (int i = 0; i < size-1; ++i)
288 dl 1.1 // ittest4(s, size, i);
289     }
290    
291     static void entest1(Hashtable ht, int size) {
292     int sum = 0;
293    
294     timer.start("Iter Enumeration Key ", size);
295     for (Enumeration en = ht.keys(); en.hasMoreElements(); ) {
296     if (en.nextElement() != MISSING)
297     ++sum;
298     }
299 jsr166 1.4 timer.finish();
300 jsr166 1.9 reallyAssert(sum == size);
301 dl 1.1 }
302    
303     static void entest2(Hashtable ht, int size) {
304     int sum = 0;
305     timer.start("Iter Enumeration Value ", size);
306     for (Enumeration en = ht.elements(); en.hasMoreElements(); ) {
307     if (en.nextElement() != MISSING)
308     ++sum;
309     }
310 jsr166 1.4 timer.finish();
311 jsr166 1.9 reallyAssert(sum == size);
312 dl 1.1 }
313    
314     static void entest3(Hashtable ht, int size) {
315     int sum = 0;
316    
317     timer.start("Iterf Enumeration Key ", size);
318 jsr166 1.4 Enumeration en = ht.keys();
319 dl 1.1 for (int i = 0; i < size; ++i) {
320     if (en.nextElement() != MISSING)
321     ++sum;
322     }
323 jsr166 1.4 timer.finish();
324 jsr166 1.9 reallyAssert(sum == size);
325 dl 1.1 }
326    
327     static void entest4(Hashtable ht, int size) {
328     int sum = 0;
329     timer.start("Iterf Enumeration Value", size);
330 jsr166 1.4 Enumeration en = ht.elements();
331 dl 1.1 for (int i = 0; i < size; ++i) {
332     if (en.nextElement() != MISSING)
333     ++sum;
334     }
335 jsr166 1.4 timer.finish();
336 jsr166 1.9 reallyAssert(sum == size);
337 dl 1.1 }
338    
339     static void entest(Map<Integer,Integer> s, int size) {
340     if (s instanceof Hashtable) {
341 jsr166 1.6 Hashtable ht = (Hashtable) s;
342 dl 1.1 // entest3(ht, size);
343     // entest4(ht, size);
344     entest1(ht, size);
345     entest2(ht, size);
346     entest1(ht, size);
347     entest2(ht, size);
348     entest1(ht, size);
349     entest2(ht, size);
350     }
351     }
352    
353     static void rtest(Map<Integer,Integer> s, int size) {
354     timer.start("Remove (iterator) ", size);
355     for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
356     it.next();
357     it.remove();
358     }
359 dl 1.3 reallyAssert(s.isEmpty());
360 jsr166 1.4 timer.finish();
361 dl 1.1 }
362    
363 dl 1.3 static void stest(Map<Integer,Integer> s, int size) throws Exception {
364 jsr166 1.4 if (!(s instanceof Serializable))
365 dl 1.3 return;
366     System.out.print("Serialize : ");
367 jsr166 1.4
368 dl 1.3 for (int i = 0; i < size; i++) {
369     s.put(Integer.valueOf(i), Integer.valueOf(1));
370 dl 1.1 }
371 dl 1.3
372     long startTime = System.nanoTime();
373    
374     FileOutputStream fs = new FileOutputStream("IntMapCheck.dat");
375     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fs));
376     out.writeObject(s);
377     out.close();
378    
379     FileInputStream is = new FileInputStream("IntMapCheck.dat");
380     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(is));
381     Map<Integer,Integer> m = (Map<Integer,Integer>)in.readObject();
382    
383     long endTime = System.nanoTime();
384     long time = endTime - startTime;
385    
386     System.out.print(time + "ms");
387    
388     if (s instanceof IdentityHashMap) return;
389 jsr166 1.9 reallyAssert(s.equals(m));
390 dl 1.1 }
391    
392 dl 1.3 static void test(Map<Integer,Integer> s, Integer[] key) {
393     int size = key.length;
394    
395     t3("Put (absent) ", size, s, key, size);
396     reallyAssert(s.size() == size);
397     t1("Get (present) ", size, s, key, size, 8);
398     t1Boxed("Get boxed (present) ", size, s, key, size);
399     ittest1(s, size);
400     t3("Put (present) ", size, s, key, 0);
401     reallyAssert(s.size() == size);
402     t7("ContainsKey ", size, s, key, absent);
403     t4("ContainsKey ", size, s, key, size);
404     ktest(s, size, key);
405     t4("ContainsKey ", absentSize, s, absent, 0);
406     t6("Get ", size, s, key, absent);
407     t1("Get (present) ", size, s, key, size, 8);
408     t1("Get (absent) ", absentSize, s, absent, 0, 1);
409     reallyAssert(s.size() == size);
410     t2("Remove (absent) ", absentSize, s, absent, 0);
411     reallyAssert(s.size() == size);
412     t5("Remove (present) ", size, s, key, size / 2);
413     reallyAssert(s.size() == size / 2);
414     t1("Get ", size, s, key, size / 2, 8);
415     ittest1(s, size / 2);
416     t3("Put (half present) ", size, s, key, size / 2);
417     reallyAssert(s.size() == size);
418     t1("Get (present) ", size, s, key, size, 4);
419    
420     entest(s, size);
421     t9(s);
422     reallyAssert(s.size() == size);
423     timer.start("Clear ", size);
424     s.clear();
425 jsr166 1.4 timer.finish();
426 dl 1.3 t1("Get (absent) ", size, s, key, 0, 1);
427     t4("ContainsKey ", size, s, key, 0);
428     t2("Remove (absent) ", size, s, key, 0);
429     t3("Put (presized) ", size, s, key, size);
430     t1("Get (present) ", size, s, key, size, 4);
431     reallyAssert(s.size() == size);
432     ittest(s, size);
433     rtest(s, size);
434     reallyAssert(s.size() == 0);
435     timer.start("Clear ", size);
436     s.clear();
437 jsr166 1.4 timer.finish();
438 dl 1.3 t3("Put (presized) ", size, s, key, size);
439 dl 1.1
440     timer.start("Put (putAll) ", size * 2);
441 jsr166 1.15 final Map<Integer,Integer> s2;
442 dl 1.1 try {
443 jsr166 1.15 s2 = (Map<Integer,Integer>)
444     s.getClass().getConstructor().newInstance();
445 dl 1.1 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     }