package org.multiverse.stms.gamma.benchmarks;
import org.benchy.BenchmarkDriver;
import org.benchy.TestCaseResult;
import org.multiverse.TestThread;
import org.multiverse.api.Txn;
import org.multiverse.api.TxnExecutor;
import org.multiverse.api.LockMode;
import org.multiverse.api.callables.TxnVoidCallable;
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 ContendedCounterDriver extends BenchmarkDriver {
private int threadCount;
private LockMode lockLevel = LockMode.None;
private long transactionsPerThread;
private boolean dirtyCheck;
private GammaStm stm;
private GammaTxnLong ref;
private IncThread[] threads;
@Override
public void setUp() {
System.out.printf("Multiverse > Thread count %s\n", threadCount);
System.out.printf("Multiverse > Transactions per thread %s\n", transactionsPerThread);
System.out.printf("Multiverse > Dirty check %s \n", dirtyCheck);
System.out.printf("Multiverse > Pessimistic lock level %s \n", lockLevel);
stm = new GammaStm();
ref = stm.getTxRefFactoryBuilder().build().newTxnLong(0);
threads = new IncThread[threadCount];
for (int k = 0; k < threads.length; k++) {
threads[k] = new IncThread(k);
}
}
@Override
public void run(TestCaseResult testCaseResult) {
startAll(threads);
joinAll(threads);
}
@Override
public void processResults(TestCaseResult testCaseResult) {
long totalDurationMs = 0;
for (IncThread t : threads) {
totalDurationMs += t.getDurationMs();
}
double transactionsPerSecondPerThread = BenchmarkUtils.transactionsPerSecondPerThread(
transactionsPerThread, totalDurationMs, threadCount);
double transactionsPerSecond = BenchmarkUtils.transactionsPerSecond(
transactionsPerThread, totalDurationMs, threadCount);
System.out.printf("Multiverse > Performance %s transactions/second/thread with %s threads\n",
format(transactionsPerSecondPerThread), threadCount);
System.out.printf("Multiverse > Performance %s transactions/second with %s threads\n",
format(transactionsPerSecond), threadCount);
testCaseResult.put("transactionsPerSecondPerThread", transactionsPerSecondPerThread);
testCaseResult.put("transactionsPerSecond", transactionsPerSecond);
}
class IncThread extends TestThread {
public IncThread(int id) {
super("IncThread-" + id);
}
@Override
public void doRun() throws Exception {
final long _incCount = transactionsPerThread;
TxnExecutor executor = stm.newTxnFactoryBuilder()
.setReadLockMode(lockLevel)
.setDirtyCheckEnabled(dirtyCheck)
.newTxnExecutor();
TxnVoidCallable callable = new TxnVoidCallable() {
@Override
public void call(Txn tx) throws Exception {
ref.increment();
}
};
for (long k = 0; k < _incCount; k++) {
executor.execute(callable);
}
}
}
}