ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/IntMapCheck.java
Revision: 1.1
Committed: Mon May 2 19:19:38 2005 UTC (19 years ago) by dl
Branch: MAIN
Log Message:
Put misc performance tests into CVS

File Contents

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