ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/NavigableMapCheck.java
Revision: 1.16
Committed: Sun Oct 23 03:03:23 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.15: +3 -4 lines
Log Message:
fix deprecation warnings for Class#newInstance

File Contents

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