package org.multiverse.stms.gamma.benchmarks.orec; 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.GlobalConflictCounter; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong; import static org.benchy.BenchyUtils.*; import static org.multiverse.TestUtils.*; public class OrecNormalNormalUpdateDriver extends BenchmarkDriver implements GammaConstants { private GammaTxnLong ref; private GlobalConflictCounter globalConflictCounter; private GammaStm stm; private int threadCount; private long operationCount = 1000 * 1000 * 1000; private UpdateThread[] threads; @Override public void setUp() { System.out.printf("Multiverse > Operation count is %s\n", operationCount); System.out.printf("Multiverse > Thread count is %s\n", threadCount); stm = new GammaStm(); ref = new GammaTxnLong(stm); globalConflictCounter = stm.getGlobalConflictCounter(); threads = new UpdateThread[threadCount]; for (int k = 0; k < threads.length; k++) { threads[k] = new UpdateThread(k); } } @Override public void run(TestCaseResult testCaseResult) { startAll(threads); joinAll(threads); assertEqualsDouble(0, globalConflictCounter.count()); } @Override public void processResults(TestCaseResult result) { long durationMs = result.getDurationMs(); double transactionsPerSecond = operationsPerSecond(operationCount, durationMs, threadCount); double transactionsPerSecondPerThread = operationsPerSecondPerThread(operationCount, durationMs, threadCount); result.put("transactionsPerSecond", transactionsPerSecond); result.put("transactionsPerSecondPerThread", transactionsPerSecondPerThread); System.out.printf("Performance : %s update-cycles/second\n", format(transactionsPerSecond)); System.out.printf("Performance : %s update-cycles/second/thread\n", format(transactionsPerSecondPerThread)); } class UpdateThread extends TestThread { public UpdateThread(int id) { super("id-" + id); } @Override public void doRun() throws Exception { final long _cycles = operationCount; final GammaTxnLong orec = new GammaTxnLong(stm); final GammaTxnLong _ref = ref; for (long k = 0; k < _cycles; k++) { int arriveStatus = orec.arrive(0); if ((arriveStatus & MASK_UNREGISTERED) == 0) { orec.lockAfterArrive(0, LOCKMODE_EXCLUSIVE); } else { orec.arriveAndLock(0, LOCKMODE_EXCLUSIVE); } orec.departAfterUpdateAndUnlock(); } System.out.printf("Orec : %s\n", orec.___toOrecString()); } } }