ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/NavigableMapCheck.java
Revision: 1.8
Committed: Tue Nov 3 01:04:02 2009 UTC (14 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.7: +1 -1 lines
Log Message:
coding style

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