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

# Content
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