ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/NavigableMapCheck.java
Revision: 1.2
Committed: Mon May 9 19:33:30 2005 UTC (18 years, 11 months 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 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 static void rittest2(NavigableMap s, int size) {
303 int sum = 0;
304 timer.start("Desc Iter Entry ", size);
305 for (Iterator it = s.descendingEntrySet().iterator(); it.hasNext(); ) {
306 if(it.next() != MISSING)
307 ++sum;
308 }
309 timer.finish();
310 reallyAssert (sum == size);
311 }
312
313 static void rittest(NavigableMap s, int size) {
314 rittest1(s, size);
315 rittest2(s, size);
316 }
317
318
319 static void rtest(NavigableMap s, int size) {
320 timer.start("Remove (iterator) ", size);
321 for (Iterator it = s.keySet().iterator(); it.hasNext(); ) {
322 it.next();
323 it.remove();
324 }
325 timer.finish();
326 }
327
328 static void rvtest(NavigableMap s, int size) {
329 timer.start("Remove (iterator) ", size);
330 for (Iterator it = s.values().iterator(); it.hasNext(); ) {
331 it.next();
332 it.remove();
333 }
334 timer.finish();
335 }
336
337
338 static void dtest(NavigableMap s, int size, Integer[] key) {
339 timer.start("Put (putAll) ", size * 2);
340 NavigableMap s2 = null;
341 try {
342 s2 = (NavigableMap) (s.getClass().newInstance());
343 s2.putAll(s);
344 }
345 catch (Exception e) { e.printStackTrace(); return; }
346 timer.finish();
347
348 timer.start("Iter Equals ", size * 2);
349 boolean eqt = s2.equals(s) && s.equals(s2);
350 reallyAssert (eqt);
351 timer.finish();
352
353 timer.start("Iter HashCode ", size * 2);
354 int shc = s.hashCode();
355 int s2hc = s2.hashCode();
356 reallyAssert (shc == s2hc);
357 timer.finish();
358
359 timer.start("Put (present) ", size);
360 s2.putAll(s);
361 timer.finish();
362
363 timer.start("Iter EntrySet contains ", size * 2);
364 Set es2 = s2.entrySet();
365 int sum = 0;
366 for (Iterator i1 = s.entrySet().iterator(); i1.hasNext(); ) {
367 Object entry = i1.next();
368 if (es2.contains(entry)) ++sum;
369 }
370 timer.finish();
371 reallyAssert (sum == size);
372
373 t6("Get ", size, s2, key, absent);
374
375 Object hold = s2.get(key[size-1]);
376 s2.put(key[size-1], absent[0]);
377 timer.start("Iter Equals ", size * 2);
378 eqt = s2.equals(s) && s.equals(s2);
379 reallyAssert (!eqt);
380 timer.finish();
381
382 timer.start("Iter HashCode ", size * 2);
383 int s1h = s.hashCode();
384 int s2h = s2.hashCode();
385 reallyAssert (s1h != s2h);
386 timer.finish();
387
388 s2.put(key[size-1], hold);
389 timer.start("Remove (iterator) ", size * 2);
390 Iterator s2i = s2.entrySet().iterator();
391 Set es = s.entrySet();
392 while (s2i.hasNext())
393 es.remove(s2i.next());
394 timer.finish();
395
396 reallyAssert (s.isEmpty());
397
398 timer.start("Clear ", size);
399 s2.clear();
400 timer.finish();
401 reallyAssert (s2.isEmpty() && s.isEmpty());
402 }
403
404
405
406 static void test(NavigableMap s, Integer[] key) {
407 int size = key.length;
408
409 t3("Put (absent) ", size, s, key, size);
410 t3("Put (present) ", size, s, key, 0);
411 t7("ContainsKey ", size, s, key, absent);
412 t4("ContainsKey ", size, s, key, size);
413 ktest(s, size, key);
414 t4("ContainsKey ", absentSize, s, absent, 0);
415 t6("Get ", size, s, key, absent);
416 t1("Get (present) ", size, s, key, size);
417 t1("Get (absent) ", absentSize, s, absent, 0);
418 t2("Remove (absent) ", absentSize, s, absent, 0);
419 t5("Remove (present) ", size, s, key, size / 2);
420 t3("Put (half present) ", size, s, key, size / 2);
421
422 ittest(s, size);
423 rittest(s, size);
424 higherTest(s);
425 ceilingTest(s);
426 floorTest(s);
427 lowerTest(s);
428 t9(s);
429 rtest(s, size);
430
431 t4("ContainsKey ", size, s, key, 0);
432 t2("Remove (absent) ", size, s, key, 0);
433 t3("Put (presized) ", size, s, key, size);
434 dtest(s, size, key);
435 }
436
437 static class TestTimer {
438 private String name;
439 private long numOps;
440 private long startTime;
441 private String cname;
442
443 static final java.util.TreeMap accum = new java.util.TreeMap();
444
445 static void printStats() {
446 for (Iterator it = accum.entrySet().iterator(); it.hasNext(); ) {
447 Map.Entry e = (Map.Entry)(it.next());
448 Stats stats = ((Stats)(e.getValue()));
449 int n = stats.number;
450 double t;
451 if (n > 0)
452 t = stats.sum / n;
453 else
454 t = stats.least;
455 long nano = Math.round(1000000.0 * t);
456 System.out.println(e.getKey() + ": " + nano);
457 }
458 }
459
460 void start(String name, long numOps) {
461 this.name = name;
462 this.cname = classify();
463 this.numOps = numOps;
464 startTime = System.currentTimeMillis();
465 }
466
467
468 String classify() {
469 if (name.startsWith("Get"))
470 return "Get ";
471 else if (name.startsWith("Put"))
472 return "Put ";
473 else if (name.startsWith("Remove"))
474 return "Remove ";
475 else if (name.startsWith("Iter"))
476 return "Iter ";
477 else
478 return null;
479 }
480
481 void finish() {
482 long endTime = System.currentTimeMillis();
483 long time = endTime - startTime;
484 double timePerOp = ((double)time)/numOps;
485
486 Object st = accum.get(name);
487 if (st == null)
488 accum.put(name, new Stats(timePerOp));
489 else {
490 Stats stats = (Stats) st;
491 stats.sum += timePerOp;
492 stats.number++;
493 if (timePerOp < stats.least) stats.least = timePerOp;
494 }
495
496 if (cname != null) {
497 st = accum.get(cname);
498 if (st == null)
499 accum.put(cname, new Stats(timePerOp));
500 else {
501 Stats stats = (Stats) st;
502 stats.sum += timePerOp;
503 stats.number++;
504 if (timePerOp < stats.least) stats.least = timePerOp;
505 }
506 }
507
508 }
509
510 }
511
512 static class Stats {
513 double sum = 0;
514 double least;
515 int number = 0;
516 Stats(double t) { least = t; }
517 }
518
519 static Random rng = new Random();
520
521 static void shuffle(Integer[] keys) {
522 int size = keys.length;
523 for (int i=size; i>1; i--) {
524 int r = rng.nextInt(i);
525 Integer t = keys[i-1];
526 keys[i-1] = keys[r];
527 keys[r] = t;
528 }
529 }
530
531 }
532