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

File Contents

# User Rev Content
1 dl 1.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 jsr166 1.6 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.1 */
6    
7     import java.util.*;
8    
9     public class DenseMapMicroBenchmark {
10     static final int ITERS_PER_TEST = 4;
11     static final long NANOS_PER_JOB = 4L * 1000L*1000L*1000L; // 4 sec
12     static final long NANOS_PER_WARMUP = 500L*1000L*1000L; // 0.5 sec
13     // map operations per iteration -- change if hasher.work changed
14     static final int OPS_PER_ITER = 4; // put + get + iter + remove
15    
16     static int SIZE = 50000; // may be replaced by program arg
17    
18     abstract static class Job {
19 jsr166 1.5 final String name;
20 dl 1.1 long nanos;
21     int runs;
22 jsr166 1.5 public Job(String name) { this.name = name; }
23     public String name() { return name; }
24     public abstract void work() throws Throwable;
25 dl 1.1 }
26    
27     /**
28     * Runs each job for at least NANOS_PER_JOB seconds.
29     * Returns array of average times per job per run.
30     */
31     static void time0(long nanos, Job ... jobs) throws Throwable {
32 jsr166 1.5 for (int i = 0; i < jobs.length; i++) {
33 dl 1.1 Thread.sleep(50);
34 jsr166 1.5 long t0 = System.nanoTime();
35     long t;
36     int j = 0;
37     do {
38 jsr166 1.2 j++;
39     jobs[i].work();
40 dl 1.1 } while ((t = System.nanoTime() - t0) < nanos);
41     jobs[i].nanos = t / j;
42     jobs[i].runs = j;
43 jsr166 1.5 }
44 dl 1.1 }
45    
46     static void time(Job ... jobs) throws Throwable {
47     time0(NANOS_PER_JOB, jobs);
48    
49 jsr166 1.5 final String nameHeader = "Method";
50 jsr166 1.8 int nameWidth = nameHeader.length();
51 jsr166 1.5 for (Job job : jobs)
52     nameWidth = Math.max(nameWidth, job.name().length());
53 dl 1.1
54     final int itemsPerTest = SIZE * OPS_PER_ITER * ITERS_PER_TEST;
55 jsr166 1.5 final String timeHeader = "Nanos/item";
56 jsr166 1.8 int timeWidth = timeHeader.length();
57 jsr166 1.5 final String ratioHeader = "Ratio";
58     int ratioWidth = ratioHeader.length();
59     String format = String.format("%%-%ds %%%dd %%.3f%%n",
60     nameWidth, timeWidth);
61     String headerFormat = String.format("%%-%ds %%-%ds %%-%ds%%n",
62     nameWidth, timeWidth, ratioWidth);
63     System.out.printf(headerFormat, "Method", "Nanos/item", "Ratio");
64    
65     // Print out absolute and relative times, calibrated against first job
66     for (int i = 0; i < jobs.length; i++) {
67     long time = jobs[i].nanos/itemsPerTest;
68     double ratio = (double) jobs[i].nanos / (double) jobs[0].nanos;
69     System.out.printf(format, jobs[i].name(), time, ratio);
70     }
71 dl 1.1 }
72    
73     static Long[] toLongs(Integer[] ints) {
74 jsr166 1.5 Long[] longs = new Long[ints.length];
75     for (int i = 0; i < ints.length; i++)
76     longs[i] = ints[i].longValue();
77     return longs;
78 dl 1.1 }
79    
80     static String[] toStrings(Integer[] ints) {
81 jsr166 1.5 String[] strings = new String[ints.length];
82     for (int i = 0; i < ints.length; i++)
83 dl 1.1 strings[i] = ints[i].toString();
84     // strings[i] = String.valueOf(ints[i].doubleValue());
85 jsr166 1.5 return strings;
86 dl 1.1 }
87    
88     static Float[] toFloats(Integer[] ints) {
89 jsr166 1.5 Float[] floats = new Float[ints.length];
90     for (int i = 0; i < ints.length; i++)
91     floats[i] = ints[i].floatValue();
92     return floats;
93 dl 1.1 }
94    
95     static Double[] toDoubles(Integer[] ints) {
96 jsr166 1.5 Double[] doubles = new Double[ints.length];
97     for (int i = 0; i < ints.length; i++)
98     doubles[i] = ints[i].doubleValue();
99     return doubles;
100 dl 1.1 }
101    
102     static final class Hasher extends Job {
103     final Object[] elts;
104 jsr166 1.7 final Class<?> mapClass;
105 dl 1.1 volatile int matches;
106 jsr166 1.7 Hasher(String name, Object[] elts, Class<?> mapClass) {
107 dl 1.1 super(name);
108     this.elts = elts;
109     this.mapClass = mapClass;
110     }
111     public void work() {
112 jsr166 1.10 final Map m;
113 dl 1.1 try {
114 jsr166 1.10 m = (Map) mapClass.getConstructor().newInstance();
115 jsr166 1.3 } catch (Exception e) {
116 dl 1.1 throw new RuntimeException("Can't instantiate " + mapClass + ": " + e);
117     }
118     final int len = elts.length;
119     for (int j = 0; j < ITERS_PER_TEST; j++) {
120     for (Object x : elts) {
121     if (m.put(x, x) != null)
122     throw new Error();
123     }
124     if (m.size() != len)
125     throw new Error();
126     int ng = 0;
127     for (Object x : elts) {
128     if (m.get(x) == x)
129     ++ng;
130     }
131     matches += ng;
132     for (Object e : m.keySet()) {
133     if (m.get(e) == e)
134     --ng;
135     }
136     if (ng != 0)
137     throw new Error();
138     for (Object x : elts) {
139     if (m.remove(x) != x)
140     throw new Error();
141     }
142     if (!m.isEmpty())
143     throw new Error();
144     }
145     if (matches != len * ITERS_PER_TEST)
146     throw new Error();
147     matches = 0;
148     }
149     }
150    
151     public static void main(String[] args) throws Throwable {
152 jsr166 1.7 Class<?> mc = java.util.HashMap.class;
153 dl 1.1 if (args.length > 0)
154     mc = Class.forName(args[0]);
155     if (args.length > 1)
156     SIZE = Integer.parseInt(args[1]);
157    
158     System.out.print("Class " + mc.getName());
159     System.out.print(" size " + SIZE);
160     System.out.println();
161    
162 jsr166 1.5 final Integer[] seq = new Integer[SIZE];
163 dl 1.1 for (int i = 0; i < SIZE; i++)
164     seq[i] = new Integer(i);
165 jsr166 1.5 final Integer[] shf = seq.clone();
166     Collections.shuffle(Arrays.asList(shf));
167     List<Hasher> hashers = new ArrayList<Hasher>();
168 dl 1.1 hashers.add(new Hasher("Integer sequential", seq, mc));
169     hashers.add(new Hasher("Integer shuffled", shf, mc));
170    
171     hashers.add(new Hasher("Long sequential", toLongs(seq), mc));
172     hashers.add(new Hasher("Long shuffled", toLongs(shf), mc));
173    
174     hashers.add(new Hasher("Float sequential", toFloats(seq), mc));
175     hashers.add(new Hasher("Float shuffled", toFloats(shf), mc));
176    
177     hashers.add(new Hasher("Double sequential", toDoubles(seq), mc));
178     hashers.add(new Hasher("Double shuffled", toDoubles(shf), mc));
179    
180     hashers.add(new Hasher("String sequential", toStrings(seq), mc));
181     hashers.add(new Hasher("String shuffled", toStrings(shf), mc));
182    
183     Hasher[] jobs = hashers.toArray(new Hasher[0]);
184     System.out.print("warmup...");
185 jsr166 1.5 time0(NANOS_PER_WARMUP, jobs); // Warm up run
186     time0(NANOS_PER_WARMUP, jobs); // Warm up run
187 dl 1.1 for (int i = 0; i < 2; i++) {
188     System.gc();
189     Thread.sleep(50);
190     System.runFinalization();
191     Thread.sleep(50);
192     }
193     System.out.println("starting");
194 jsr166 1.5 time(jobs);
195 dl 1.1 }
196    
197     }