ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/jsr166e/LongAdderDemo.java
Revision: 1.1
Committed: Sun Jul 31 14:20:11 2011 UTC (12 years, 10 months ago) by dl
Branch: MAIN
Log Message:
Rename classes

File Contents

# User Rev Content
1 dl 1.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.concurrent.Phaser;
8     import java.util.concurrent.ExecutorService;
9     import java.util.concurrent.Executors;
10     import java.util.concurrent.atomic.AtomicLong;
11     import jsr166e.LongAdder;
12    
13     public class LongAdderDemo {
14     static final int INCS_PER_THREAD = 10000000;
15     static final int NCPU = Runtime.getRuntime().availableProcessors();
16     static final ExecutorService pool = Executors.newCachedThreadPool();
17    
18     public static void main(String[] args) {
19     System.out.println("Warmup...");
20     int half = NCPU > 1 ? NCPU / 2 : 1;
21     casTest(half, 1000);
22     adderTest(half, 1000);
23    
24     for (int reps = 0; reps < 2; ++reps) {
25     System.out.println("Running...");
26     for (int i = 1; i <= NCPU * 2; i <<= 1) {
27     casTest(i, INCS_PER_THREAD);
28     adderTest(i, INCS_PER_THREAD);
29     }
30     }
31     pool.shutdown();
32     }
33    
34     static void casTest(int nthreads, int incs) {
35     System.out.print("AtomicLong ");
36     Phaser phaser = new Phaser(nthreads + 1);
37     AtomicLong a = new AtomicLong();
38     for (int i = 0; i < nthreads; ++i)
39     pool.execute(new CasTask(a, phaser, incs));
40     report(nthreads, incs, timeTasks(phaser), a.get());
41     }
42    
43     static void adderTest(int nthreads, int incs) {
44     System.out.print("LongAdder ");
45     Phaser phaser = new Phaser(nthreads + 1);
46     LongAdder a = new LongAdder();
47     for (int i = 0; i < nthreads; ++i)
48     pool.execute(new AdderTask(a, phaser, incs));
49     report(nthreads, incs, timeTasks(phaser), a.sum());
50     }
51    
52     static void report(int nthreads, int incs, long time, long sum) {
53     long total = (long)nthreads * incs;
54     if (sum != total)
55     throw new Error(sum + " != " + total);
56     double secs = (double)time / (1000L * 1000 * 1000);
57     long rate = total * (1000L) / time;
58     System.out.printf("threads:%3d Time: %7.3fsec Incs per microsec: %4d\n",
59     nthreads, secs, rate);
60     }
61    
62     static long timeTasks(Phaser phaser) {
63     phaser.arriveAndAwaitAdvance();
64     long start = System.nanoTime();
65     phaser.arriveAndAwaitAdvance();
66     phaser.arriveAndAwaitAdvance();
67     return System.nanoTime() - start;
68     }
69    
70     static final class AdderTask implements Runnable {
71     final LongAdder adder;
72     final Phaser phaser;
73     final int incs;
74     volatile long result;
75     AdderTask(LongAdder adder, Phaser phaser, int incs) {
76     this.adder = adder;
77     this.phaser = phaser;
78     this.incs = incs;
79     }
80    
81     public void run() {
82     phaser.arriveAndAwaitAdvance();
83     phaser.arriveAndAwaitAdvance();
84     LongAdder a = adder;
85     for (int i = 0; i < incs; ++i)
86     a.increment();
87     result = a.sum();
88     phaser.arrive();
89     }
90     }
91    
92     static final class CasTask implements Runnable {
93     final AtomicLong adder;
94     final Phaser phaser;
95     final int incs;
96     volatile long result;
97     CasTask(AtomicLong adder, Phaser phaser, int incs) {
98     this.adder = adder;
99     this.phaser = phaser;
100     this.incs = incs;
101     }
102    
103     public void run() {
104     phaser.arriveAndAwaitAdvance();
105     phaser.arriveAndAwaitAdvance();
106     AtomicLong a = adder;
107     for (int i = 0; i < incs; ++i)
108     a.getAndIncrement();
109     result = a.get();
110     phaser.arrive();
111     }
112     }
113    
114     }