ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/ConcurrentQueueLoops.java
Revision: 1.5
Committed: Mon Feb 19 00:46:06 2007 UTC (17 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.4: +2 -9 lines
Log Message:
Uniform headers

File Contents

# User Rev Content
1 dl 1.1 /*
2     * Written by Doug Lea with assistance from members of JCP JSR-166
3 dl 1.5 * Expert Group and released to the public domain, as explained at
4     * http://creativecommons.org/licenses/publicdomain
5 dl 1.1 */
6    
7     import java.util.*;
8     import java.util.concurrent.*;
9 dl 1.2 import java.util.concurrent.locks.*;
10 dl 1.1 import java.util.concurrent.atomic.*;
11    
12     public class ConcurrentQueueLoops {
13     static final ExecutorService pool = Executors.newCachedThreadPool();
14     static boolean print = false;
15 dl 1.3 static final Integer zero = new Integer(0);
16     static final Integer one = new Integer(1);
17 dl 1.2 static int workMask;
18     static final long RUN_TIME_NANOS = 5 * 1000L * 1000L * 1000L;
19 dl 1.3 static final int BATCH_SIZE = 8;
20 dl 1.1
21     public static void main(String[] args) throws Exception {
22 dl 1.3 int maxStages = 100;
23     int work = 1024;
24 dl 1.1 Class klass = null;
25     if (args.length > 0) {
26     try {
27     klass = Class.forName(args[0]);
28     } catch(ClassNotFoundException e) {
29     throw new RuntimeException("Class " + args[0] + " not found.");
30     }
31     }
32    
33     if (args.length > 1)
34     maxStages = Integer.parseInt(args[1]);
35    
36 dl 1.2 if (args.length > 2)
37     work = Integer.parseInt(args[2]);
38    
39     workMask = work - 1;
40 dl 1.1 System.out.print("Class: " + klass.getName());
41 dl 1.2 System.out.print(" stages: " + maxStages);
42     System.out.println(" work: " + work);
43 dl 1.1
44     print = false;
45     System.out.println("Warmup...");
46 dl 1.4 // oneRun(klass, 4);
47     //
48 dl 1.1 Thread.sleep(100);
49 dl 1.2 oneRun(klass, 1);
50 dl 1.1 Thread.sleep(100);
51     print = true;
52    
53 dl 1.2 int k = 1;
54     for (int i = 1; i <= maxStages;) {
55     oneRun(klass, i);
56     if (i == k) {
57     k = i << 1;
58     i = i + (i >>> 1);
59     }
60     else
61     i = k;
62 dl 1.1 }
63     pool.shutdown();
64     }
65    
66 dl 1.2 static final class Stage implements Callable<Integer> {
67 dl 1.1 final Queue<Integer> queue;
68     final CyclicBarrier barrier;
69 dl 1.3 final int nthreads;
70     Stage (Queue<Integer> q, CyclicBarrier b, int nthreads) {
71 dl 1.1 queue = q;
72     barrier = b;
73 dl 1.3 this.nthreads = nthreads;
74 dl 1.2 }
75    
76     static int compute(int l) {
77     if (l == 0)
78     return (int)System.nanoTime();
79 dl 1.3 int nn = (l >>> 7) & workMask;
80 dl 1.2 while (nn-- > 0)
81 dl 1.3 l = LoopHelpers.compute6(l);
82 dl 1.2 return l;
83 dl 1.1 }
84    
85     public Integer call() {
86     try {
87     barrier.await();
88 dl 1.2 long now = System.nanoTime();
89     long stopTime = now + RUN_TIME_NANOS;
90     int l = (int)now;
91 dl 1.1 int takes = 0;
92 dl 1.2 int misses = 0;
93 dl 1.3 int lmask = 1;
94 dl 1.1 for (;;) {
95 dl 1.2 l = compute(l);
96 dl 1.1 Integer item = queue.poll();
97     if (item != null) {
98     ++takes;
99 dl 1.3 if (item == one)
100     l = LoopHelpers.compute6(l);
101 dl 1.2 } else if ((misses++ & 255) == 0 &&
102     System.nanoTime() >= stopTime) {
103 dl 1.3 return new Integer(takes);
104 dl 1.2 } else {
105 dl 1.3 for (int i = 0; i < BATCH_SIZE; ++i) {
106     queue.offer(((l & lmask)== 0)? zero : one);
107     if ((lmask <<= 1) == 0) lmask = 1;
108     if (i != 0) l = compute(l);
109     }
110 dl 1.1 }
111     }
112     }
113     catch (Exception ie) {
114     ie.printStackTrace();
115     throw new Error("Call loop failed");
116     }
117     }
118     }
119    
120 dl 1.2 static void oneRun(Class klass, int n) throws Exception {
121 dl 1.1 Queue<Integer> q = (Queue<Integer>)klass.newInstance();
122     LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
123     CyclicBarrier barrier = new CyclicBarrier(n + 1, timer);
124     ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>(n);
125     for (int i = 0; i < n; ++i)
126 dl 1.3 results.add(pool.submit(new Stage(q, barrier, n)));
127 dl 1.1
128     if (print)
129     System.out.print("Threads: " + n + "\t:");
130     barrier.await();
131     int total = 0;
132     for (int i = 0; i < n; ++i) {
133     Future<Integer> f = results.get(i);
134     Integer r = f.get();
135     total += r.intValue();
136     }
137     long endTime = System.nanoTime();
138     long time = endTime - timer.startTime;
139 dl 1.3 long ips = 1000000000L * total / time;
140    
141     if (print)
142     System.out.print(LoopHelpers.rightJustify(ips) + " items per sec");
143 dl 1.1 if (print)
144 dl 1.3 System.out.println();
145 dl 1.1 }
146 dl 1.2
147 dl 1.1 }