ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/ConcurrentQueueLoops.java
Revision: 1.18
Committed: Sun Oct 23 03:03:23 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.17: +2 -1 lines
Log Message:
fix deprecation warnings for Class#newInstance

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 */
6
7 import java.util.*;
8 import java.util.concurrent.*;
9 import java.util.concurrent.atomic.*;
10 import java.util.concurrent.locks.*;
11
12 public class ConcurrentQueueLoops {
13 static final ExecutorService pool = Executors.newCachedThreadPool();
14 static boolean print = false;
15 static final Integer zero = new Integer(0);
16 static final Integer one = new Integer(1);
17 static int workMask;
18 static final long RUN_TIME_NANOS = 5 * 1000L * 1000L * 1000L;
19 static final int BATCH_SIZE = 8;
20
21 public static void main(String[] args) throws Exception {
22 int maxStages = 100;
23 int work = 1024;
24 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 if (args.length > 2)
37 work = Integer.parseInt(args[2]);
38
39 workMask = work - 1;
40 System.out.print("Class: " + klass.getName());
41 System.out.print(" stages: " + maxStages);
42 System.out.println(" work: " + work);
43
44 print = false;
45 System.out.println("Warmup...");
46 // oneRun(klass, 4);
47 //
48 Thread.sleep(100);
49 oneRun(klass, 1);
50 Thread.sleep(100);
51 print = true;
52
53 for (int k = 1, i = 1; i <= maxStages;) {
54 oneRun(klass, i);
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 final class Stage implements Callable<Integer> {
66 final Queue<Integer> queue;
67 final CyclicBarrier barrier;
68 final int nthreads;
69 Stage(Queue<Integer> q, CyclicBarrier b, int nthreads) {
70 queue = q;
71 barrier = b;
72 this.nthreads = nthreads;
73 }
74
75 static int compute(int l) {
76 if (l == 0)
77 return (int) System.nanoTime();
78 int nn = (l >>> 7) & workMask;
79 while (nn-- > 0)
80 l = LoopHelpers.compute6(l);
81 return l;
82 }
83
84 public Integer call() {
85 try {
86 barrier.await();
87 long now = System.nanoTime();
88 long stopTime = now + RUN_TIME_NANOS;
89 int l = (int) now;
90 int takes = 0;
91 int misses = 0;
92 int lmask = 1;
93 for (;;) {
94 l = compute(l);
95 Integer item = queue.poll();
96 if (item != null) {
97 ++takes;
98 if (item == one)
99 l = LoopHelpers.compute6(l);
100 } else if ((misses++ & 255) == 0 &&
101 System.nanoTime() >= stopTime) {
102 return Integer.valueOf(takes);
103 } else {
104 for (int i = 0; i < BATCH_SIZE; ++i) {
105 queue.offer(((l & lmask)== 0) ? zero : one);
106 if ((lmask <<= 1) == 0) lmask = 1;
107 if (i != 0) l = compute(l);
108 }
109 }
110 }
111 }
112 catch (Exception ie) {
113 ie.printStackTrace();
114 throw new Error("Call loop failed");
115 }
116 }
117 }
118
119 static void oneRun(Class<?> klass, int n) throws Exception {
120 Queue<Integer> q =
121 (Queue<Integer>) klass.getConstructor().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 results.add(pool.submit(new Stage(q, barrier, n)));
127
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 long ips = 1000000000L * total / time;
140
141 if (print)
142 System.out.print(LoopHelpers.rightJustify(ips) + " items per sec");
143 if (print)
144 System.out.println();
145 }
146
147 }