76 }
77
78 static void casTest(int nthreads, int incs) {
79 System.out.print("AtomicLong ");
80 Phaser phaser = new Phaser(nthreads + 1);
81 AtomicLong a = new AtomicLong();
82 for (int i = 0; i < nthreads; ++i)
83 pool.execute(new CasTask(a, phaser, incs));
84 report(nthreads, incs, timeTasks(phaser), a.get());
85 }
86
87 static void adderTest(int nthreads, int incs) {
88 System.out.print("LongAdder ");
89 Phaser phaser = new Phaser(nthreads + 1);
90 LongAdder a = new LongAdder();
91 for (int i = 0; i < nthreads; ++i)
92 pool.execute(new AdderTask(a, phaser, incs));
93 report(nthreads, incs, timeTasks(phaser), a.sum());
94 }
95
96 static void report(int nthreads, int incs, long time, long sum) {
97 long total = (long)nthreads * incs;
98 if (sum != total)
99 throw new Error(sum + " != " + total);
100 double secs = (double)time / (1000L * 1000 * 1000);
101 long rate = total * (1000L) / time;
102 System.out.printf("threads:%3d Time: %7.3fsec Incs per microsec: %4d\n",
103 nthreads, secs, rate);
104 }
105
106 static long timeTasks(Phaser phaser) {
107 phaser.arriveAndAwaitAdvance();
108 long start = System.nanoTime();
109 phaser.arriveAndAwaitAdvance();
110 phaser.arriveAndAwaitAdvance();
111 return System.nanoTime() - start;
112 }
113
114 static final class AdderTask implements Runnable {
115 final LongAdder adder;
116 final Phaser phaser;
117 final int incs;
118 volatile long result;
119 AdderTask(LongAdder adder, Phaser phaser, int incs) {
120 this.adder = adder;
121 this.phaser = phaser;
122 this.incs = incs;
123 }
|
76 }
77
78 static void casTest(int nthreads, int incs) {
79 System.out.print("AtomicLong ");
80 Phaser phaser = new Phaser(nthreads + 1);
81 AtomicLong a = new AtomicLong();
82 for (int i = 0; i < nthreads; ++i)
83 pool.execute(new CasTask(a, phaser, incs));
84 report(nthreads, incs, timeTasks(phaser), a.get());
85 }
86
87 static void adderTest(int nthreads, int incs) {
88 System.out.print("LongAdder ");
89 Phaser phaser = new Phaser(nthreads + 1);
90 LongAdder a = new LongAdder();
91 for (int i = 0; i < nthreads; ++i)
92 pool.execute(new AdderTask(a, phaser, incs));
93 report(nthreads, incs, timeTasks(phaser), a.sum());
94 }
95
96 static void report(int nthreads, int incs, long elapsedNanos, long sum) {
97 long total = (long)nthreads * incs;
98 if (sum != total)
99 throw new Error(sum + " != " + total);
100 double elapsedSecs = (double)elapsedNanos / (1000L * 1000 * 1000);
101 long rate = total * 1000L / elapsedNanos;
102 System.out.printf("threads:%3d Time: %7.3fsec Incs per microsec: %4d\n",
103 nthreads, elapsedSecs, rate);
104 }
105
106 static long timeTasks(Phaser phaser) {
107 phaser.arriveAndAwaitAdvance();
108 long start = System.nanoTime();
109 phaser.arriveAndAwaitAdvance();
110 phaser.arriveAndAwaitAdvance();
111 return System.nanoTime() - start;
112 }
113
114 static final class AdderTask implements Runnable {
115 final LongAdder adder;
116 final Phaser phaser;
117 final int incs;
118 volatile long result;
119 AdderTask(LongAdder adder, Phaser phaser, int incs) {
120 this.adder = adder;
121 this.phaser = phaser;
122 this.incs = incs;
123 }
|