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

# Content
1 /*
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 /**
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