ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/CachedThreadPoolLoops.java
Revision: 1.8
Committed: Thu Dec 18 18:13:06 2014 UTC (9 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.7: +2 -4 lines
Log Message:
move k = 1 into loop initializer

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.3 * Expert Group and released to the public domain, as explained at
4 jsr166 1.6 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.1 */
6    
7 dl 1.4 //import jsr166y.*;
8 dl 1.1 import java.util.concurrent.*;
9     import java.util.concurrent.atomic.*;
10    
11     public class CachedThreadPoolLoops {
12 dl 1.4 static final int NCPUS = Runtime.getRuntime().availableProcessors();
13 dl 1.1 static final AtomicInteger remaining = new AtomicInteger();
14     static final int maxIters = 1000000;
15    
16     public static void main(String[] args) throws Exception {
17 dl 1.4 int maxThreads = NCPUS * 3 / 2; // 100;
18 jsr166 1.5 if (args.length > 0)
19 dl 1.1 maxThreads = Integer.parseInt(args[0]);
20 dl 1.2
21     System.out.print("Warmup:");
22 dl 1.4 for (int j = 0; j < 1; ++j) {
23 jsr166 1.8 for (int k = 1, i = 1; i <= maxThreads;) {
24 dl 1.2 System.out.print(" " + i);
25     oneTest(i, 10000, false);
26     Thread.sleep(100);
27     if (i == k) {
28     k = i << 1;
29     i = i + (i >>> 1);
30 jsr166 1.5 }
31     else
32 dl 1.2 i = k;
33     }
34     }
35     System.out.println();
36    
37 jsr166 1.8 for (int k = 1, i = 1; i <= maxThreads;) {
38 dl 1.1 System.out.println("Threads:" + i);
39 dl 1.2 oneTest(i, maxIters, true);
40 dl 1.1 Thread.sleep(100);
41     if (i == k) {
42     k = i << 1;
43     i = i + (i >>> 1);
44 jsr166 1.5 }
45     else
46 dl 1.1 i = k;
47     }
48 jsr166 1.7 }
49 dl 1.1
50 dl 1.2 static void oneTest(int nThreads, int iters, boolean print) throws Exception {
51 dl 1.4 Thread.sleep(100); // System.gc();
52     if (print) System.out.print("LinkedTransferQueue ");
53     oneRun(new LinkedTransferQueue<Runnable>(), nThreads, iters, print);
54    
55     Thread.sleep(100); // System.gc();
56     if (print) System.out.print("LinkedBlockingQueue ");
57     oneRun(new LinkedBlockingQueue<Runnable>(), nThreads, iters, print);
58    
59     Thread.sleep(100); // System.gc();
60     if (print) System.out.print("SynchronousQueue ");
61 dl 1.2 oneRun(new SynchronousQueue<Runnable>(false), nThreads, iters, print);
62 dl 1.4
63     Thread.sleep(100); // System.gc();
64     if (print) System.out.print("SynchronousQueue(fair) ");
65 dl 1.2 oneRun(new SynchronousQueue<Runnable>(true), nThreads, iters, print);
66 dl 1.4
67     Thread.sleep(100); // System.gc();
68     if (print) System.out.print("LinkedTransferQueue(xfer)");
69     oneRun(new LTQasSQ<Runnable>(), nThreads, iters, print);
70    
71     Thread.sleep(100); // System.gc();
72     if (print) System.out.print("LinkedTransferQueue(half)");
73     oneRun(new HalfSyncLTQ<Runnable>(), nThreads, iters, print);
74    
75     Thread.sleep(100); // System.gc();
76     if (print) System.out.print("ArrayBlockingQueue(256) ");
77     oneRun(new ArrayBlockingQueue<Runnable>(256), nThreads, iters, print);
78    
79 dl 1.1 }
80    
81     static final class Task implements Runnable {
82     final ThreadPoolExecutor pool;
83     final CountDownLatch done;
84 jsr166 1.5 Task(ThreadPoolExecutor p, CountDownLatch d) {
85     pool = p;
86 dl 1.1 done = d;
87     }
88     public void run() {
89     done.countDown();
90     remaining.incrementAndGet();
91     int n;
92     while (!Thread.interrupted() &&
93 jsr166 1.5 (n = remaining.get()) > 0 &&
94 dl 1.1 done.getCount() > 0) {
95     if (remaining.compareAndSet(n, n-1)) {
96     try {
97     pool.execute(this);
98     }
99     catch (RuntimeException ex) {
100     System.out.print("*");
101     while (done.getCount() > 0) done.countDown();
102     return;
103     }
104     }
105     }
106     }
107     }
108 jsr166 1.5
109 dl 1.2 static void oneRun(BlockingQueue<Runnable> q, int nThreads, int iters, boolean print) throws Exception {
110 jsr166 1.5
111     ThreadPoolExecutor pool =
112 dl 1.1 new ThreadPoolExecutor(nThreads+1, Integer.MAX_VALUE,
113     1L, TimeUnit.SECONDS, q);
114    
115 dl 1.2 CountDownLatch done = new CountDownLatch(iters);
116 dl 1.1 remaining.set(nThreads-1);
117     pool.prestartAllCoreThreads();
118     Task t = new Task(pool, done);
119     long start = System.nanoTime();
120     pool.execute(t);
121     done.await();
122     long time = System.nanoTime() - start;
123 dl 1.2 if (print)
124     System.out.println("\t: " + LoopHelpers.rightJustify(time / iters) + " ns per task");
125     q.clear();
126     Thread.sleep(100);
127     pool.shutdown();
128     Thread.sleep(100);
129 dl 1.1 pool.shutdownNow();
130     }
131    
132 dl 1.4 static final class LTQasSQ<T> extends LinkedTransferQueue<T> {
133     LTQasSQ() { super(); }
134     public void put(T x) {
135 jsr166 1.5 try { super.transfer(x);
136 dl 1.4 } catch (InterruptedException ex) { throw new Error(); }
137     }
138     }
139    
140     static final class HalfSyncLTQ<T> extends LinkedTransferQueue<T> {
141     int calls;
142     HalfSyncLTQ() { super(); }
143     public void put(T x) {
144     if ((++calls & 1) == 0)
145     super.put(x);
146     else {
147 jsr166 1.5 try { super.transfer(x);
148     } catch (InterruptedException ex) {
149     throw new Error();
150 dl 1.4 }
151     }
152     }
153     }
154    
155 dl 1.1 }