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