package org.multiverse.stms.gamma.benchmarks;
import org.benchy.BenchmarkDriver;
import org.benchy.TestCaseResult;
import org.multiverse.TestThread;
import org.multiverse.stms.gamma.GammaConstants;
import org.multiverse.stms.gamma.GammaStm;
import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong;
import static org.benchy.BenchyUtils.format;
import static org.multiverse.TestUtils.joinAll;
import static org.multiverse.TestUtils.startAll;
public class AtomicSetDriver extends BenchmarkDriver implements GammaConstants {
private transient GammaStm stm;
private transient GetThread[] threads;
private int threadCount;
private long transactionsPerThread;
private boolean sharedRef;
@Override
public void setUp() {
System.out.printf("Multiverse > Threadcount %s\n", threadCount);
System.out.printf("Multiverse > Transactions/Thread %s \n", transactionsPerThread);
System.out.printf("Multiverse > SharedRef %s \n", sharedRef);
stm = new GammaStm();
threads = new GetThread[threadCount];
GammaTxnLong ref = sharedRef ? new GammaTxnLong(stm) : null;
for (int k = 0; k < threads.length; k++) {
threads[k] = new GetThread(k, ref == null ? new GammaTxnLong(stm) : ref);
}
}
@Override
public void run(TestCaseResult testCaseResult) {
startAll(threads);
joinAll(threads);
}
@Override
public void processResults(TestCaseResult testCaseResult) {
long totalDurationMs = 0;
for (GetThread t : threads) {
totalDurationMs += t.durationMs;
}
double transactionsPerSecondPerThread = BenchmarkUtils.transactionsPerSecondPerThread(
transactionsPerThread, totalDurationMs, threadCount);
System.out.printf("Multiverse > Performance %s transactions/second/thread\n",
format(transactionsPerSecondPerThread));
System.out.printf("Multiverse > Performance %s transactions/second\n",
BenchmarkUtils.transactionsPerSecondAsString(transactionsPerThread, totalDurationMs, threadCount));
testCaseResult.put("transactionsPerSecondPerThread", transactionsPerSecondPerThread);
}
class GetThread extends TestThread {
private long durationMs;
private final GammaTxnLong ref;
public GetThread(int id, GammaTxnLong ref) {
super("AtomicGetThread-" + id);
setPriority(Thread.MAX_PRIORITY);
this.ref = ref;
}
public void doRun() {
long startMs = System.currentTimeMillis();
final long _transactionsPerThread = transactionsPerThread;
for (long k = 0; k < _transactionsPerThread; k++) {
ref.atomicGet();
}
durationMs = System.currentTimeMillis() - startMs;
System.out.printf("Multiverse > %s is finished in %s ms\n", getName(), durationMs);
}
}
}