ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/ProducerConsumerLoops.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 * @test
3 * @synopsis multiple producers and consumers using blocking queues
4 */
5 /*
6 * Written by Doug Lea with assistance from members of JCP JSR-166
7 * Expert Group and released to the public domain. Use, modify, and
8 * redistribute this code in any way without acknowledgement.
9 */
10
11 import java.util.concurrent.*;
12
13 public class ProducerConsumerLoops {
14 static final int CAPACITY = 100;
15
16 static final ExecutorService pool = Executors.newCachedThreadPool();
17 static boolean print = false;
18 static int producerSum;
19 static int consumerSum;
20 static synchronized void addProducerSum(int x) {
21 producerSum += x;
22 }
23
24 static synchronized void addConsumerSum(int x) {
25 consumerSum += x;
26 }
27
28 static synchronized void checkSum() {
29 if (producerSum != consumerSum)
30 throw new Error("CheckSum mismatch");
31 }
32
33 public static void main(String[] args) throws Exception {
34 int maxPairs = 100;
35 int iters = 100000;
36
37 if (args.length > 0)
38 maxPairs = Integer.parseInt(args[0]);
39
40 print = false;
41 System.out.println("Warmup...");
42 oneTest(1, 10000);
43 Thread.sleep(100);
44 oneTest(2, 10000);
45 Thread.sleep(100);
46 oneTest(2, 10000);
47 Thread.sleep(100);
48 print = true;
49
50 int k = 1;
51 for (int i = 1; i <= maxPairs;) {
52 System.out.println("Pairs:" + i);
53 oneTest(i, iters);
54 Thread.sleep(100);
55 if (i == k) {
56 k = i << 1;
57 i = i + (i >>> 1);
58 }
59 else
60 i = k;
61 }
62 pool.shutdown();
63 }
64
65 static void oneTest(int pairs, int iters) throws Exception {
66 int fairIters = iters/20;
67 if (print)
68 System.out.print("ArrayBlockingQueue ");
69 oneRun(new ArrayBlockingQueue<Integer>(CAPACITY), pairs, iters);
70
71 if (print)
72 System.out.print("LinkedBlockingQueue ");
73 oneRun(new LinkedBlockingQueue<Integer>(CAPACITY), pairs, iters);
74
75 if (print)
76 System.out.print("LinkedBlockingDeque ");
77 oneRun(new LinkedBlockingDeque<Integer>(CAPACITY), pairs, iters);
78
79 if (print)
80 System.out.print("SynchronousQueue ");
81 oneRun(new SynchronousQueue<Integer>(), pairs, iters);
82
83 if (print)
84 System.out.print("SynchronousQueue(fair) ");
85 oneRun(new SynchronousQueue<Integer>(true), pairs, fairIters);
86
87 if (print)
88 System.out.print("PriorityBlockingQueue ");
89 oneRun(new PriorityBlockingQueue<Integer>(), pairs, fairIters);
90
91 if (print)
92 System.out.print("ArrayBlockingQueue(fair)");
93 oneRun(new ArrayBlockingQueue<Integer>(CAPACITY, true), pairs, fairIters);
94
95 }
96
97 static abstract class Stage implements Runnable {
98 final int iters;
99 final BlockingQueue<Integer> queue;
100 final CyclicBarrier barrier;
101 Stage (BlockingQueue<Integer> q, CyclicBarrier b, int iters) {
102 queue = q;
103 barrier = b;
104 this.iters = iters;
105 }
106 }
107
108 static class Producer extends Stage {
109 Producer(BlockingQueue<Integer> q, CyclicBarrier b, int iters) {
110 super(q, b, iters);
111 }
112
113 public void run() {
114 try {
115 barrier.await();
116 int s = 0;
117 int l = hashCode();
118 for (int i = 0; i < iters; ++i) {
119 l = LoopHelpers.compute4(l);
120 queue.put(new Integer(l));
121 s += LoopHelpers.compute4(l);
122 }
123 addProducerSum(s);
124 barrier.await();
125 }
126 catch (Exception ie) {
127 ie.printStackTrace();
128 return;
129 }
130 }
131 }
132
133 static class Consumer extends Stage {
134 Consumer(BlockingQueue<Integer> q, CyclicBarrier b, int iters) {
135 super(q, b, iters);
136 }
137
138 public void run() {
139 try {
140 barrier.await();
141 int l = 0;
142 int s = 0;
143 for (int i = 0; i < iters; ++i) {
144 l = LoopHelpers.compute4(queue.take().intValue());
145 s += l;
146 }
147 addConsumerSum(s);
148 barrier.await();
149 }
150 catch (Exception ie) {
151 ie.printStackTrace();
152 return;
153 }
154 }
155
156 }
157
158 static void oneRun(BlockingQueue<Integer> q, int npairs, int iters) throws Exception {
159 LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
160 CyclicBarrier barrier = new CyclicBarrier(npairs * 2 + 1, timer);
161 for (int i = 0; i < npairs; ++i) {
162 pool.execute(new Producer(q, barrier, iters));
163 pool.execute(new Consumer(q, barrier, iters));
164 }
165 barrier.await();
166 barrier.await();
167 long time = timer.getTime();
168 checkSum();
169 if (print)
170 System.out.println("\t: " + LoopHelpers.rightJustify(time / (iters * npairs)) + " ns per transfer");
171 }
172
173 }