package org.multiverse.stms.gamma.benchmarks; import org.benchy.BenchmarkDriver; import org.benchy.TestCaseResult; import org.multiverse.TestThread; import org.multiverse.api.LockMode; import org.multiverse.stms.gamma.GammaConstants; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnRef; import org.multiverse.stms.gamma.transactions.GammaTxnConfig; import org.multiverse.stms.gamma.transactions.fat.FatMonoGammaTxn; import static org.junit.Assert.assertEquals; import static org.multiverse.TestUtils.joinAll; import static org.multiverse.TestUtils.startAll; public class BoxingOverheadDriver extends BenchmarkDriver implements GammaConstants { private GammaStm stm; private boolean withBoxing; private long transactionsPerThread; private int threadCount; private UpdateThread[] threads; @Override public void setUp() { System.out.printf("Multiverse > Transactions/thread %s \n", BenchmarkUtils.format(transactionsPerThread)); System.out.printf("Multiverse > ThreadCount %s \n", threadCount); System.out.printf("Multiverse > With Boxing %s \n", withBoxing); stm = new GammaStm(); 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); } @Override public void processResults(TestCaseResult testCaseResult) { long totalDurationMs = 0; for (UpdateThread t : threads) { totalDurationMs += t.durationMs; } double transactionsPerSecondPerThread = BenchmarkUtils.transactionsPerSecondPerThread( transactionsPerThread, totalDurationMs, threadCount); double transactionsPerSecond = BenchmarkUtils.transactionsPerSecond( transactionsPerThread, totalDurationMs, threadCount); System.out.printf("Multiverse > Performance %s transactions/second/thread\n", BenchmarkUtils.format(transactionsPerSecondPerThread)); System.out.printf("Multiverse > Performance %s transactions/second\n", BenchmarkUtils.format(transactionsPerSecond)); testCaseResult.put("transactionsPerThreadPerSecond", transactionsPerSecondPerThread); testCaseResult.put("transactionsPerSecond", transactionsPerSecond); } class UpdateThread extends TestThread { private long durationMs; public UpdateThread(int id) { super("UpdateThread-" + id); } public void doRun() { FatMonoGammaTxn tx = new FatMonoGammaTxn( new GammaTxnConfig(stm) .setReadLockMode(LockMode.Exclusive) .setDirtyCheckEnabled(false)); long startMs = System.currentTimeMillis(); final long _transactionCount = transactionsPerThread; if (withBoxing) { GammaTxnRef<Long> ref = new GammaTxnRef<Long>(stm, new Long(0)); for (long k = 0; k < _transactionCount; k++) { ref.openForWrite(tx, LOCKMODE_NONE).long_value++; tx.commit(); tx.hardReset(); } assertEquals(_transactionCount, (long) ref.atomicGet()); } else { GammaTxnLong ref = new GammaTxnLong(stm); for (long k = 0; k < _transactionCount; k++) { ref.openForWrite(tx, LOCKMODE_NONE).long_value++; tx.commit(); tx.hardReset(); } assertEquals(_transactionCount, ref.atomicGet()); } durationMs = System.currentTimeMillis() - startMs; System.out.printf("Multiverse > %s is finished in %s ms\n", getName(), durationMs); } } }