ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/LockLoops.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 * A simple test program. Feel free to play.
3 */
4
5 import java.util.concurrent.*;
6 import java.util.concurrent.locks.*;
7 import java.util.*;
8
9 public final class LockLoops {
10 static final ExecutorService pool = Executors.newCachedThreadPool();
11 static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
12 static boolean print = false;
13 static boolean doBuiltin = true;
14 static boolean doReadWrite = true;
15 static boolean doSemaphore = true;
16 static boolean doFair = true;
17
18 public static void main(String[] args) throws Exception {
19 int maxThreads = 100;
20 int iters = 1000000;
21 int replications = 1;
22
23 if (args.length > 0)
24 maxThreads = Integer.parseInt(args[0]);
25
26 if (args.length > 1)
27 iters = Integer.parseInt(args[1]);
28
29 if (args.length > 2)
30 replications = Integer.parseInt(args[2]);
31
32 rng.setSeed(3122688L);
33
34 print = false;
35 System.out.println("Warmup...");
36 oneTest(3, 10000);
37 Thread.sleep(1000);
38 oneTest(2, 10000);
39 Thread.sleep(100);
40 oneTest(1, 100000);
41 Thread.sleep(100);
42 oneTest(1, 100000);
43 Thread.sleep(1000);
44 print = true;
45
46 for (int i = 1; i <= maxThreads; ++i) {
47 for (int j = 0; j < replications; ++j) {
48 System.out.println("Threads:" + i);
49 oneTest(i, iters / i);
50 Thread.sleep(100);
51 }
52 }
53 pool.shutdown();
54 }
55
56 static void oneTest(int nthreads, int iters) throws Exception {
57 int v = rng.next();
58
59 if (print)
60 System.out.print("No shared vars ");
61 new NoLockLoop().test(v, nthreads, iters * 10);
62 Thread.sleep(10);
63
64 if (print)
65 System.out.print("No Lock + volatile ");
66 new NoLockVolatileLoop().test(v, nthreads, iters);
67 Thread.sleep(10);
68
69 if (doBuiltin) {
70 if (print)
71 System.out.print("builtin lock ");
72 new BuiltinLockLoop().test(v, nthreads, iters);
73 Thread.sleep(10);
74 }
75
76 if (print)
77 System.out.print("ReentrantLock ");
78 new ReentrantLockLoop().test(v, nthreads, iters);
79 Thread.sleep(10);
80
81 if (doReadWrite) {
82 if (print)
83 System.out.print("ReentrantWriteLock ");
84 new ReentrantWriteLockLoop().test(v, nthreads, iters);
85 Thread.sleep(10);
86
87 if (print)
88 System.out.print("ReentrantReadWriteLock");
89 new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
90 Thread.sleep(10);
91
92 }
93
94 if (doSemaphore) {
95 if (print)
96 System.out.print("Semaphore ");
97 new SemaphoreLoop().test(v, nthreads, iters);
98 Thread.sleep(10);
99
100 if (print)
101 System.out.print("FairSemaphore ");
102 new FairSemaphoreLoop().test(v, nthreads, iters);
103 Thread.sleep(10);
104
105 }
106
107 if (doFair) {
108 if (print)
109 System.out.print("FairReentrantLock ");
110 new FairReentrantLockLoop().test(v, nthreads, iters);
111 Thread.sleep(10);
112
113 if (doReadWrite) {
114 if (print)
115 System.out.print("FairRWriteLock ");
116 new FairReentrantWriteLockLoop().test(v, nthreads, iters);
117 Thread.sleep(10);
118
119 if (print)
120 System.out.print("FairRReadWriteLock ");
121 new FairReentrantReadWriteLockLoop().test(v, nthreads, iters);
122 Thread.sleep(10);
123 }
124
125 }
126
127 }
128
129 static abstract class LockLoop implements Runnable {
130 int v;
131 int iters;
132 volatile int result;
133 final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
134 CyclicBarrier barrier;
135
136 final void test(int initialValue, int nthreads, int iters) throws Exception {
137 v = initialValue;
138 this.iters = iters;
139 barrier = new CyclicBarrier(nthreads+1, timer);
140 for (int i = 0; i < nthreads; ++i)
141 pool.execute(this);
142 barrier.await();
143 barrier.await();
144 long time = timer.getTime();
145 if (print) {
146 long tpi = time / (iters * nthreads);
147 System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
148 // double secs = (double)(time) / 1000000000.0;
149 // System.out.print("\t " + secs + "s run time");
150 System.out.println();
151 }
152
153 if (result == 0) // avoid overoptimization
154 System.out.println("useless result: " + result);
155 }
156 abstract int loop(int n);
157 public final void run() {
158 try {
159 barrier.await();
160 result += loop(iters);
161 barrier.await();
162 }
163 catch (Exception ie) {
164 return;
165 }
166 }
167
168 }
169
170 private static class BuiltinLockLoop extends LockLoop {
171 final int loop(int n) {
172 int sum = 0;
173 while (n-- > 0) {
174 synchronized(this) {
175 v = LoopHelpers.compute1(v);
176 }
177 sum += LoopHelpers.compute2(v);
178 }
179 return sum;
180 }
181 }
182
183 private static class NoLockLoop extends LockLoop {
184 final int loop(int n) {
185 int sum = 0;
186 int y = v;
187 while (n-- > 0) {
188 y = LoopHelpers.compute1(y);
189 sum += LoopHelpers.compute2(y);
190 }
191 return sum;
192 }
193 }
194
195 private static class NoLockVolatileLoop extends LockLoop {
196 volatile private int vv;
197 final int loop(int n) {
198 int sum = 0;
199 while (n-- > 0) {
200 int y = LoopHelpers.compute1(vv);
201 vv = y;
202 sum += LoopHelpers.compute2(y);
203 }
204 return sum;
205 }
206 }
207
208 private static class ReentrantLockLoop extends LockLoop {
209 final private ReentrantLock lock = new ReentrantLock();
210 final int loop(int n) {
211 int sum = 0;
212 while (n-- > 0) {
213 lock.lock();
214 try {
215 v = LoopHelpers.compute1(v);
216 }
217 finally {
218 lock.unlock();
219 }
220 sum += LoopHelpers.compute2(v);
221 }
222 return sum;
223 }
224 }
225
226 private static class FairReentrantLockLoop extends LockLoop {
227 final private ReentrantLock lock = new ReentrantLock(true);
228 final int loop(int n) {
229 int sum = 0;
230 while (n-- > 0) {
231 lock.lock();
232 try {
233 v = LoopHelpers.compute1(v);
234 }
235 finally {
236 lock.unlock();
237 }
238 sum += LoopHelpers.compute2(v);
239 }
240 return sum;
241 }
242 }
243
244 private static class ReentrantWriteLockLoop extends LockLoop {
245 final private Lock lock = new ReentrantReadWriteLock().writeLock();
246 final int loop(int n) {
247 int sum = 0;
248 while (n-- > 0) {
249 lock.lock();
250 try {
251 v = LoopHelpers.compute1(v);
252 }
253 finally {
254 lock.unlock();
255 }
256 sum += LoopHelpers.compute2(v);
257 }
258 return sum;
259 }
260 }
261
262 private static class ReentrantReadWriteLockLoop extends LockLoop {
263 final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
264 final int loop(int n) {
265 int sum = 0;
266 while (n-- > 0) {
267 int x;
268 lock.readLock().lock();
269 try {
270 x = LoopHelpers.compute1(v);
271 }
272 finally {
273 lock.readLock().unlock();
274 }
275 lock.writeLock().lock();
276 try {
277 v = x;
278 }
279 finally {
280 lock.writeLock().unlock();
281 }
282 sum += LoopHelpers.compute2(v);
283 }
284 return sum;
285 }
286 }
287
288 private static class FairReentrantWriteLockLoop extends LockLoop {
289 final Lock lock = new ReentrantReadWriteLock(true).writeLock();
290 final int loop(int n) {
291 int sum = 0;
292 while (n-- > 0) {
293 lock.lock();
294 try {
295 v = LoopHelpers.compute1(v);
296 }
297 finally {
298 lock.unlock();
299 }
300 sum += LoopHelpers.compute2(v);
301 }
302 return sum;
303 }
304 }
305
306 private static class SemaphoreLoop extends LockLoop {
307 final private Semaphore sem = new Semaphore(1, false);
308 final int loop(int n) {
309 int sum = 0;
310 try {
311 while (n-- > 0) {
312 sem.acquire();
313 try {
314 v = LoopHelpers.compute1(v);
315 }
316 finally {
317 sem.release();
318 }
319 sum += LoopHelpers.compute2(v);
320 }
321 }
322 catch (InterruptedException ie) {
323 return sum;
324 }
325 return sum;
326 }
327 }
328 private static class FairSemaphoreLoop extends LockLoop {
329 final private Semaphore sem = new Semaphore(1, true);
330 final int loop(int n) {
331 int sum = 0;
332 try {
333 while (n-- > 0) {
334 sem.acquire();
335 try {
336 v = LoopHelpers.compute1(v);
337 }
338 finally {
339 sem.release();
340 }
341 sum += LoopHelpers.compute2(v);
342 }
343 }
344 catch (InterruptedException ie) {
345 return sum;
346 }
347 return sum;
348 }
349 }
350
351 private static class FairReentrantReadWriteLockLoop extends LockLoop {
352 final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
353 final int loop(int n) {
354 int sum = 0;
355 while (n-- > 0) {
356 int x;
357 lock.readLock().lock();
358 try {
359 x = LoopHelpers.compute1(v);
360 }
361 finally {
362 lock.readLock().unlock();
363 }
364 lock.writeLock().lock();
365 try {
366 v = x;
367 }
368 finally {
369 lock.writeLock().unlock();
370 }
371 sum += LoopHelpers.compute2(v);
372 }
373 return sum;
374 }
375 }
376
377
378 }