Skip to content

Commit d7c089c

Browse files
committed
adding simple performance test
Not using JMH since it is not yet in the project
1 parent 51cf042 commit d7c089c

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package org.dataloader.performance;
2+
3+
import java.time.Duration;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.concurrent.ExecutionException;
7+
import java.util.concurrent.ExecutorService;
8+
import java.util.concurrent.Executors;
9+
import java.util.concurrent.Future;
10+
import java.util.concurrent.atomic.AtomicLong;
11+
import java.util.concurrent.atomic.LongAdder;
12+
13+
public class AtomicVsAdder {
14+
15+
private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool();
16+
17+
public static void main(final String[] args) throws Exception {
18+
// knobs
19+
final var iterationsList = List.of(1 << 20L, 1 << 24L);
20+
final var numberOfThreadsList = List.of(1, 2, 4, 8, 16);
21+
final var strategies = List.of(new LongAdderStrategy(), new AtomicLongStrategy());
22+
23+
// test
24+
System.out.println("testing with #cpu=" + Runtime.getRuntime().availableProcessors());
25+
for (int iterations : iterationsList) {
26+
for (int numberOfThreads : numberOfThreadsList) {
27+
for (Strategy strategy : strategies) {
28+
performTest(iterations, numberOfThreads, strategy);
29+
}
30+
}
31+
}
32+
33+
EXECUTOR.shutdownNow();
34+
35+
}
36+
37+
private static void performTest(final long iterations, final int numberOfThreads, Strategy strategy) throws Exception {
38+
final List<Future<?>> futures = new ArrayList<>();
39+
System.out.println("start test with " + iterations + " iterations using " + numberOfThreads + " threads and strategy " + strategy.getClass().getSimpleName());
40+
final long start = System.nanoTime();
41+
42+
for (int i = 0; i < numberOfThreads; i++) {
43+
Future<?> submit = EXECUTOR.submit(() -> concurrentWork(strategy, iterations));
44+
futures.add(submit);
45+
}
46+
for (final Future<?> future : futures) {
47+
future.get(); // wait for all
48+
}
49+
final long end = System.nanoTime();
50+
System.out.println("done in " + Duration.ofNanos(end - start).toMillis() + "ms => result " + strategy.get());
51+
System.out.println("----");
52+
strategy.reset();
53+
}
54+
55+
@SuppressWarnings("SameParameterValue")
56+
private static void concurrentWork(final Strategy strategy, final long iterations) {
57+
long work = iterations;
58+
while (work-- > 0) {
59+
strategy.increment();
60+
}
61+
}
62+
63+
interface Strategy {
64+
void increment();
65+
66+
long get();
67+
68+
void reset();
69+
}
70+
71+
static class LongAdderStrategy implements Strategy {
72+
73+
private LongAdder longAdder = new LongAdder();
74+
75+
@Override
76+
public void increment() {
77+
longAdder.increment();
78+
}
79+
80+
@Override
81+
public long get() {
82+
return longAdder.sum();
83+
}
84+
85+
@Override
86+
public void reset() {
87+
longAdder = new LongAdder();
88+
}
89+
}
90+
91+
static class AtomicLongStrategy implements Strategy {
92+
93+
private final AtomicLong atomicLong = new AtomicLong(0);
94+
95+
@Override
96+
public void increment() {
97+
atomicLong.incrementAndGet();
98+
}
99+
100+
@Override
101+
public long get() {
102+
return atomicLong.get();
103+
}
104+
105+
@Override
106+
public void reset() {
107+
atomicLong.set(0);
108+
}
109+
}
110+
111+
}

0 commit comments

Comments
 (0)