ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/UncheckedLockLoops.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

# User Rev Content
1 dl 1.1 /*
2     * @test
3     * @summary basic safety and liveness of ReentrantLocks, and other locks based on them
4     */
5    
6     import java.util.concurrent.*;
7     import java.util.concurrent.locks.*;
8     import java.util.*;
9    
10     public final class UncheckedLockLoops {
11     static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
12     static boolean print = false;
13     static boolean doBuiltin = true;
14    
15     public static void main(String[] args) throws Exception {
16     int maxThreads = 100;
17     int iters = 10000000;
18    
19     if (args.length > 0)
20     maxThreads = Integer.parseInt(args[0]);
21    
22     rng.setSeed(3122688L);
23    
24     print = false;
25     System.out.println("Warmup...");
26     oneTest(1, 100000);
27     Thread.sleep(1000);
28     oneTest(3, 10000);
29     Thread.sleep(1000);
30     oneTest(2, 10000);
31     Thread.sleep(100);
32     oneTest(1, 100000);
33     Thread.sleep(100);
34     oneTest(1, 100000);
35     Thread.sleep(1000);
36     print = true;
37    
38     System.out.println("Threads:" + 1);
39     oneTest(1, iters / 1);
40     Thread.sleep(100);
41    
42     for (int i = 1; i <= maxThreads; i += (i+1) >>> 1) {
43     System.out.println("Threads:" + i);
44     oneTest(i, iters / i);
45     Thread.sleep(100);
46     }
47    
48     }
49    
50     static void oneTest(int nthreads, int iters) throws Exception {
51     int fairIters = (nthreads <= 1)? iters : iters/20;
52     int v = rng.next();
53    
54     if (print)
55     System.out.print("NoLock (1 thread) ");
56     new NoLockLoop().test(v, 1, iters * nthreads);
57     Thread.sleep(10);
58    
59     if (print)
60     System.out.print("ReentrantLock ");
61     new ReentrantLockLoop().test(v, nthreads, iters);
62     Thread.sleep(10);
63    
64     if (false) {
65     if (print)
66     System.out.print("FairReentrantLock ");
67     new FairReentrantLockLoop().test(v, nthreads, fairIters);
68     Thread.sleep(10);
69     }
70     if (doBuiltin) {
71     if (print)
72     System.out.print("builtin lock ");
73     new BuiltinLockLoop().test(v, nthreads, fairIters);
74     Thread.sleep(10);
75     }
76    
77     if (print)
78     System.out.print("Mutex ");
79     new MutexLoop().test(v, nthreads, iters);
80     Thread.sleep(10);
81    
82     if (print)
83     System.out.print("LongMutex ");
84     new LongMutexLoop().test(v, nthreads, iters);
85     Thread.sleep(10);
86    
87     if (print)
88     System.out.print("Semaphore ");
89     new SemaphoreLoop().test(v, nthreads, iters);
90     Thread.sleep(10);
91    
92     if (print)
93     System.out.print("FairSemaphore ");
94     new FairSemaphoreLoop().test(v, nthreads, fairIters);
95     Thread.sleep(10);
96    
97     if (print)
98     System.out.print("ReentrantWriteLock ");
99     new ReentrantWriteLockLoop().test(v, nthreads, iters);
100     Thread.sleep(10);
101    
102     if (print)
103     System.out.print("FairRWriteLock ");
104     new FairReentrantWriteLockLoop().test(v, nthreads, fairIters);
105     Thread.sleep(10);
106    
107     if (print)
108     System.out.print("ReentrantReadWriteLock");
109     new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
110     Thread.sleep(10);
111    
112     if (print)
113     System.out.print("FairRReadWriteLock ");
114     new FairReentrantReadWriteLockLoop().test(v, nthreads, fairIters);
115     Thread.sleep(10);
116    
117     }
118    
119     static abstract class LockLoop implements Runnable {
120     int value;
121     int checkValue;
122     int iters;
123     volatile int result;
124     volatile int failures;
125     final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
126     CyclicBarrier barrier;
127    
128     final int setValue(int v) {
129     checkValue = v ^ 0x55555555;
130     value = v;
131     return v;
132     }
133    
134     final int getValue() {
135     int v = value;
136     if (checkValue != ~(v ^ 0xAAAAAAAA))
137     ++failures;
138     return v;
139     }
140    
141     final void test(int initialValue, int nthreads, int iters) throws Exception {
142     setValue(initialValue);
143     this.iters = iters;
144     barrier = new CyclicBarrier(nthreads+1, timer);
145     for (int i = 0; i < nthreads; ++i)
146     new Thread(this).start();
147     barrier.await();
148     barrier.await();
149     long time = timer.getTime();
150     if (print) {
151     long tpi = time / (iters * nthreads);
152     System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
153     // double secs = (double)(time) / 1000000000.0;
154     // System.out.print("\t " + secs + "s run time");
155     System.out.println();
156     }
157    
158     if (result == 0) // avoid overoptimization
159     System.out.println("useless result: " + result);
160     if (failures != 0)
161     throw new Error("protection failure?");
162     }
163     abstract int loop(int n);
164     public final void run() {
165     try {
166     barrier.await();
167     result += loop(iters);
168     barrier.await();
169     }
170     catch (Exception ie) {
171     return;
172     }
173     }
174    
175     }
176    
177     private static class NoLockLoop extends LockLoop {
178     private volatile int readBarrier;
179     final int loop(int n) {
180     int sum = 0;
181     int x = 0;;
182     while (n-- > 0) {
183     int r1 = readBarrier;
184     x = setValue(LoopHelpers.compute1(getValue()));
185     int r2 = readBarrier;
186     if (r1 == r2 && (x & 255) == 0)
187     ++readBarrier;
188     sum += LoopHelpers.compute2(x);
189     }
190     return sum;
191     }
192     }
193    
194     private static class BuiltinLockLoop extends LockLoop {
195     final int loop(int n) {
196     int sum = 0;
197     int x = 0;;
198     while (n-- > 0) {
199     synchronized(this) {
200     x = setValue(LoopHelpers.compute1(getValue()));
201     }
202     sum += LoopHelpers.compute2(x);
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     final ReentrantLock lock = this.lock;
212     int sum = 0;
213     int x = 0;
214     while (n-- > 0) {
215     lock.lock();
216     try {
217     x = setValue(LoopHelpers.compute1(getValue()));
218     }
219     finally {
220     lock.unlock();
221     }
222     sum += LoopHelpers.compute2(x);
223     }
224     return sum;
225     }
226     }
227    
228     private static class MutexLoop extends LockLoop {
229     final private Mutex lock = new Mutex();
230     final int loop(int n) {
231     final Mutex lock = this.lock;
232     int sum = 0;
233     int x = 0;
234     while (n-- > 0) {
235     lock.lock();
236     try {
237     x = setValue(LoopHelpers.compute1(getValue()));
238     }
239     finally {
240     lock.unlock();
241     }
242     sum += LoopHelpers.compute2(x);
243     }
244     return sum;
245     }
246     }
247    
248     private static class LongMutexLoop extends LockLoop {
249     final private LongMutex lock = new LongMutex();
250     final int loop(int n) {
251     final LongMutex lock = this.lock;
252     int sum = 0;
253     int x = 0;
254     while (n-- > 0) {
255     lock.lock();
256     try {
257     x = setValue(LoopHelpers.compute1(getValue()));
258     }
259     finally {
260     lock.unlock();
261     }
262     sum += LoopHelpers.compute2(x);
263     }
264     return sum;
265     }
266     }
267    
268     private static class FairReentrantLockLoop extends LockLoop {
269     final private ReentrantLock lock = new ReentrantLock(true);
270     final int loop(int n) {
271     final ReentrantLock lock = this.lock;
272     int sum = 0;
273     int x = 0;
274     while (n-- > 0) {
275     lock.lock();
276     try {
277     x = setValue(LoopHelpers.compute1(getValue()));
278     }
279     finally {
280     lock.unlock();
281     }
282     sum += LoopHelpers.compute2(x);
283     }
284     return sum;
285     }
286     }
287    
288     private static class ReentrantWriteLockLoop extends LockLoop {
289     final private Lock lock = new ReentrantReadWriteLock().writeLock();
290     final int loop(int n) {
291     final Lock lock = this.lock;
292     int sum = 0;
293     int x = 0;
294     while (n-- > 0) {
295     lock.lock();
296     try {
297     x = setValue(LoopHelpers.compute1(getValue()));
298     }
299     finally {
300     lock.unlock();
301     }
302     sum += LoopHelpers.compute2(x);
303     }
304     return sum;
305     }
306     }
307    
308     private static class FairReentrantWriteLockLoop extends LockLoop {
309     final Lock lock = new ReentrantReadWriteLock(true).writeLock();
310     final int loop(int n) {
311     final Lock lock = this.lock;
312     int sum = 0;
313     int x = 0;
314     while (n-- > 0) {
315     lock.lock();
316     try {
317     x = setValue(LoopHelpers.compute1(getValue()));
318     }
319     finally {
320     lock.unlock();
321     }
322     sum += LoopHelpers.compute2(x);
323     }
324     return sum;
325     }
326     }
327    
328     private static class SemaphoreLoop extends LockLoop {
329     final private Semaphore sem = new Semaphore(1, false);
330     final int loop(int n) {
331     final Semaphore sem = this.sem;
332     int sum = 0;
333     int x = 0;
334     while (n-- > 0) {
335     sem.acquireUninterruptibly();
336     try {
337     x = setValue(LoopHelpers.compute1(getValue()));
338     }
339     finally {
340     sem.release();
341     }
342     sum += LoopHelpers.compute2(x);
343     }
344     return sum;
345     }
346     }
347     private static class FairSemaphoreLoop extends LockLoop {
348     final private Semaphore sem = new Semaphore(1, true);
349     final int loop(int n) {
350     final Semaphore sem = this.sem;
351     int sum = 0;
352     int x = 0;
353     while (n-- > 0) {
354     sem.acquireUninterruptibly();
355     try {
356     x = setValue(LoopHelpers.compute1(getValue()));
357     }
358     finally {
359     sem.release();
360     }
361     sum += LoopHelpers.compute2(x);
362     }
363     return sum;
364     }
365     }
366    
367     private static class ReentrantReadWriteLockLoop extends LockLoop {
368     final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
369     final int loop(int n) {
370     final Lock rlock = lock.readLock();
371     final Lock wlock = lock.writeLock();
372     int sum = 0;
373     int x = 0;
374     while (n-- > 0) {
375     if ((n & 16) != 0) {
376     rlock.lock();
377     try {
378     x = LoopHelpers.compute1(getValue());
379     x = LoopHelpers.compute2(x);
380     }
381     finally {
382     rlock.unlock();
383     }
384     }
385     else {
386     wlock.lock();
387     try {
388     setValue(x);
389     }
390     finally {
391     wlock.unlock();
392     }
393     sum += LoopHelpers.compute2(x);
394     }
395     }
396     return sum;
397     }
398    
399     }
400    
401    
402     private static class FairReentrantReadWriteLockLoop extends LockLoop {
403     final private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
404     final int loop(int n) {
405     final Lock rlock = lock.readLock();
406     final Lock wlock = lock.writeLock();
407     int sum = 0;
408     int x = 0;
409     while (n-- > 0) {
410     if ((n & 16) != 0) {
411     rlock.lock();
412     try {
413     x = LoopHelpers.compute1(getValue());
414     x = LoopHelpers.compute2(x);
415     }
416     finally {
417     rlock.unlock();
418     }
419     }
420     else {
421     wlock.lock();
422     try {
423     setValue(x);
424     }
425     finally {
426     wlock.unlock();
427     }
428     sum += LoopHelpers.compute2(x);
429     }
430     }
431     return sum;
432     }
433    
434     }
435     }