ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/IntMapCheck.java
Revision: 1.2
Committed: Mon May 9 19:33:30 2005 UTC (19 years ago) by dl
Branch: MAIN
Changes since 1.1: +5 -0 lines
Log Message:
Add headers

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