82 }
83 else
84 mapClass = java.util.concurrent.ConcurrentHashMap.class;
85
86 if (args.length > 1)
87 maxThreads = Integer.parseInt(args[1]);
88
89 if (args.length > 2)
90 nkeys = Integer.parseInt(args[2]);
91
92 if (args.length > 3)
93 pinsert = Integer.parseInt(args[3]);
94
95 if (args.length > 4)
96 premove = Integer.parseInt(args[4]);
97
98 if (args.length > 5)
99 nops = Integer.parseInt(args[5]);
100
101 // normalize probabilities wrt random number generator
102 removesPerMaxRandom = (int)(((double)premove/100.0 * 0x7FFFFFFFL));
103 insertsPerMaxRandom = (int)(((double)pinsert/100.0 * 0x7FFFFFFFL));
104
105 System.out.print("Class: " + mapClass.getName());
106 System.out.print(" threads: " + maxThreads);
107 System.out.print(" size: " + nkeys);
108 System.out.print(" ins: " + pinsert);
109 System.out.print(" rem: " + premove);
110 System.out.print(" ops: " + nops);
111 System.out.println();
112
113 int k = 1;
114 int warmups = 2;
115 for (int i = 1; i <= maxThreads;) {
116 test(i, nkeys, mapClass);
117 if (warmups > 0)
118 --warmups;
119 else if (i == k) {
120 k = i << 1;
121 i = i + (i >>> 1);
122 }
123 else if (i == 1 && k == 2) {
155 }
156
157 static void test(int i, int nkeys, Class mapClass) throws Exception {
158 System.out.print("Threads: " + i + "\t:");
159 Map<Integer, Integer> map = (Map<Integer, Integer>)
160 mapClass.getDeclaredConstructor().newInstance();
161 Integer[] key = makeKeys(nkeys);
162 // Uncomment to start with a non-empty table
163 // for (int j = 0; j < nkeys; j += 4) // start 1/4 occupied
164 // map.put(key[j], key[j]);
165 LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
166 CyclicBarrier barrier = new CyclicBarrier(i+1, timer);
167 SplittableRandom rnd = new SplittableRandom();
168 for (int t = 0; t < i; ++t)
169 pool.execute(new Runner(map, key, barrier, rnd.split()));
170 barrier.await();
171 barrier.await();
172 long time = timer.getTime();
173 long tpo = time / (i * (long)nops);
174 System.out.print(LoopHelpers.rightJustify(tpo) + " ns per op");
175 double secs = (double)(time) / 1000000000.0;
176 System.out.println("\t " + secs + "s run time");
177 map.clear();
178 }
179
180 static class Runner implements Runnable {
181 final Map<Integer,Integer> map;
182 final Integer[] key;
183 final CyclicBarrier barrier;
184 final SplittableRandom rnd;
185 int position;
186 int total;
187
188 Runner(Map<Integer,Integer> map,
189 Integer[] key,
190 CyclicBarrier barrier,
191 SplittableRandom rnd) {
192 this.map = map;
193 this.key = key;
194 this.barrier = barrier;
195 this.rnd = rnd;
|
82 }
83 else
84 mapClass = java.util.concurrent.ConcurrentHashMap.class;
85
86 if (args.length > 1)
87 maxThreads = Integer.parseInt(args[1]);
88
89 if (args.length > 2)
90 nkeys = Integer.parseInt(args[2]);
91
92 if (args.length > 3)
93 pinsert = Integer.parseInt(args[3]);
94
95 if (args.length > 4)
96 premove = Integer.parseInt(args[4]);
97
98 if (args.length > 5)
99 nops = Integer.parseInt(args[5]);
100
101 // normalize probabilities wrt random number generator
102 removesPerMaxRandom = (int)((double)premove/100.0 * 0x7FFFFFFFL);
103 insertsPerMaxRandom = (int)((double)pinsert/100.0 * 0x7FFFFFFFL);
104
105 System.out.print("Class: " + mapClass.getName());
106 System.out.print(" threads: " + maxThreads);
107 System.out.print(" size: " + nkeys);
108 System.out.print(" ins: " + pinsert);
109 System.out.print(" rem: " + premove);
110 System.out.print(" ops: " + nops);
111 System.out.println();
112
113 int k = 1;
114 int warmups = 2;
115 for (int i = 1; i <= maxThreads;) {
116 test(i, nkeys, mapClass);
117 if (warmups > 0)
118 --warmups;
119 else if (i == k) {
120 k = i << 1;
121 i = i + (i >>> 1);
122 }
123 else if (i == 1 && k == 2) {
155 }
156
157 static void test(int i, int nkeys, Class mapClass) throws Exception {
158 System.out.print("Threads: " + i + "\t:");
159 Map<Integer, Integer> map = (Map<Integer, Integer>)
160 mapClass.getDeclaredConstructor().newInstance();
161 Integer[] key = makeKeys(nkeys);
162 // Uncomment to start with a non-empty table
163 // for (int j = 0; j < nkeys; j += 4) // start 1/4 occupied
164 // map.put(key[j], key[j]);
165 LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
166 CyclicBarrier barrier = new CyclicBarrier(i+1, timer);
167 SplittableRandom rnd = new SplittableRandom();
168 for (int t = 0; t < i; ++t)
169 pool.execute(new Runner(map, key, barrier, rnd.split()));
170 barrier.await();
171 barrier.await();
172 long time = timer.getTime();
173 long tpo = time / (i * (long)nops);
174 System.out.print(LoopHelpers.rightJustify(tpo) + " ns per op");
175 double secs = (double)time / 1000000000.0;
176 System.out.println("\t " + secs + "s run time");
177 map.clear();
178 }
179
180 static class Runner implements Runnable {
181 final Map<Integer,Integer> map;
182 final Integer[] key;
183 final CyclicBarrier barrier;
184 final SplittableRandom rnd;
185 int position;
186 int total;
187
188 Runner(Map<Integer,Integer> map,
189 Integer[] key,
190 CyclicBarrier barrier,
191 SplittableRandom rnd) {
192 this.map = map;
193 this.key = key;
194 this.barrier = barrier;
195 this.rnd = rnd;
|