SpeedCount.java
package ch.hslu.exercises.sw08.ex2;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
/**
* Speed-Test für unterschiedlich impementierte Counters.
*/
public final class SpeedCount {
private static final Logger LOG = LoggerFactory.getLogger(SpeedCount.class);
/**
* Privater Konstruktor.
*/
private SpeedCount() {
}
/**
* Test für einen Counter.
*
* @param counter Zählertyp.
* @param counts Anzahl Zähl-Vorgänge.
* @param threads Anzahl Tester-Threads.
* @return Dauer des Tests in mSec.
*/
public static long speedTest(Counter counter, int counts, int threads) throws ExecutionException, InterruptedException {
long duration;
long start;
long stop;
try (final ExecutorService executor = Executors.newCachedThreadPool()) {
start = System.currentTimeMillis();
List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < threads; i++) {
futures.add(executor.submit(new CountTask(counter, counts)));
}
for (Future<Integer> future : futures) {
future.get();
}
stop = System.currentTimeMillis();
}
duration = stop - start;
return duration;
}
/**
* Main-Counter-Test.
*
* @param args not used.
*/
public static void main(final String args[]) throws ExecutionException, InterruptedException {
final int passes = 10;
final int threads = Runtime.getRuntime().availableProcessors();
final int counts = 10_000;
final Counter counterSync = new SynchronizedCounter();
long sumSync = 0;
// cold run
speedTest(counterSync, counts, threads);
for (int i = 0; i < passes; i++) {
sumSync += speedTest(counterSync, counts, threads);
}
final Counter counterAtom = new AtomicCounter();
long sumAtom = 0;
for (int i = 0; i < passes; i++) {
sumAtom += speedTest(counterAtom, counts, threads);
}
if (counterSync.get() == 0) {
LOG.info("Sync counter ok");
LOG.info("Sync counter average test duration = {} ms", sumSync / (float) passes);
} else {
LOG.info("Sync counter failed");
}
if (counterAtom.get() == 0) {
LOG.info("Atom counter ok");
LOG.info("Atom counter average test duration = {} ms", sumAtom / (float) passes);
} else {
LOG.info("Atom counter failed");
}
}
}