ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/IntMapCheck.java
Revision: 1.14
Committed: Thu Jan 15 18:34:19 2015 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.13: +0 -11 lines
Log Message:
delete extraneous blank lines

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