ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/LongAdderLoops.java
(Generate patch)

Comparing jsr166/src/test/loops/LongAdderLoops.java (file contents):
Revision 1.4 by jsr166, Mon Jan 26 17:30:04 2015 UTC vs.
Revision 1.5 by jsr166, Mon Jan 26 17:52:44 2015 UTC

# Line 10 | Line 10 | import java.util.concurrent.ExecutorServ
10   import java.util.concurrent.Phaser;
11  
12   public class LongAdderLoops {
13    static final int ITERS = 100_000_000;
14    static final int NCPU = Runtime.getRuntime().availableProcessors();
15    static final int MAX_THREADS = NCPU * 2;
16
17    static final ExecutorService pool = Executors.newCachedThreadPool();
18
13      public static void main(String[] args) {
14 <        for (int i = 1; i < MAX_THREADS; ++i)
15 <            adderTest(i, ITERS);
14 >        final int NCPU = Runtime.getRuntime().availableProcessors();
15 >        int minThreads = 1;
16 >        int maxThreads = 2 * NCPU;
17 >        long iters = 300_000_000L;
18 >        nextArg: for (String arg : args) {
19 >            String[] fields = arg.split("=");
20 >            if (fields.length == 2) {
21 >                String prop = fields[0], val = fields[1];
22 >                switch (prop) {
23 >                case "threads":
24 >                    minThreads = maxThreads = Integer.valueOf(val);
25 >                    continue nextArg;
26 >                case "minThreads":
27 >                    minThreads = Integer.valueOf(val);
28 >                    continue nextArg;
29 >                case "maxThreads":
30 >                    maxThreads = Integer.valueOf(val);
31 >                    continue nextArg;
32 >                case "iters":
33 >                    iters = Long.valueOf(val);
34 >                    continue nextArg;
35 >                }
36 >            }
37 >            throw new Error("Usage: LongAdderLoops minThreads=n maxThreads=n threads=n iters=n");
38 >        }
39 >
40 >        final ExecutorService pool = Executors.newCachedThreadPool();
41 >        for (int i = minThreads; i <= maxThreads; i += (i+1) >>> 1)
42 >            adderTest(pool, i, iters);
43          pool.shutdown();
44      }
45  
46 <    static void adderTest(int nthreads, int incs) {
46 >    static void adderTest(ExecutorService pool, int nthreads, long iters) {
47          System.out.print("LongAdder  ");
48          Phaser phaser = new Phaser(nthreads + 1);
49          LongAdder a = new LongAdder();
50          for (int i = 0; i < nthreads; ++i)
51 <            pool.execute(new AdderTask(a, phaser, incs));
52 <        report(nthreads, incs, timeTasks(phaser), a.sum());
51 >            pool.execute(new AdderTask(a, phaser, iters));
52 >        report(nthreads, iters, timeTasks(phaser), a.sum());
53      }
54  
55 <    static void report(int nthreads, int incs, long time, long sum) {
56 <        long total = (long)nthreads * incs;
55 >    static void report(int nthreads, long iters, long time, long sum) {
56 >        long total = (long)nthreads * iters;
57          if (sum != total)
58              throw new Error(sum + " != " + total);
59          double secs = (double)time / (1000L * 1000 * 1000);
60          long rate = total * (1000L) / time;
61 <        System.out.printf("threads:%3d  Time: %7.3fsec  Incs per microsec: %4d\n",
61 >        System.out.printf("threads:%3d  Time: %7.3fsec  Iters per microsec: %4d\n",
62                            nthreads, secs, rate);
63      }
64  
# Line 52 | Line 73 | public class LongAdderLoops {
73      static final class AdderTask implements Runnable {
74          final LongAdder adder;
75          final Phaser phaser;
76 <        final int incs;
76 >        final long iters;
77          volatile long result;
78 <        AdderTask(LongAdder adder, Phaser phaser, int incs) {
78 >        AdderTask(LongAdder adder, Phaser phaser, long iters) {
79              this.adder = adder;
80              this.phaser = phaser;
81 <            this.incs = incs;
81 >            this.iters = iters;
82          }
83  
84          public void run() {
85              phaser.arriveAndAwaitAdvance();
86              phaser.arriveAndAwaitAdvance();
87              LongAdder a = adder;
88 <            for (int i = 0; i < incs; ++i)
88 >            for (long i = 0; i < iters; ++i)
89                  a.increment();
90              result = a.sum();
91              phaser.arrive();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines