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 org.multiverse.stms.gamma.transactions.GammaTxnConfig; import org.multiverse.stms.gamma.transactions.fat.FatFixedLengthGammaTxn; import static org.benchy.BenchyUtils.format; import static org.multiverse.TestUtils.joinAll; import static org.multiverse.TestUtils.startAll; import static org.multiverse.stms.gamma.GammaTestUtils.makeReadBiased; /** * @author Peter Veentjer */ public class MultipleUpdateDriver extends BenchmarkDriver implements GammaConstants { private GammaStm stm; private long transactionsPerThread; private int refCount; private int threadCount; private WriteThread[] threads; @Override public void setUp() { System.out.printf("Multiverse > Multiple update transaction benchmark\n"); System.out.printf("Multiverse > Running with %s ref per transaction\n", refCount); System.out.printf("Multiverse > %s Transactions per thread\n", format(transactionsPerThread)); stm = new GammaStm(); threads = new WriteThread[threadCount]; for (int k = 0; k < threads.length; k++) { threads[k] = new WriteThread(k, refCount); } } @Override public void processResults(TestCaseResult testCaseResult) { long totalDurationMs = 0; for (WriteThread 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 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); } @Override public void run(TestCaseResult testCaseResult) { System.out.printf("Multiverse > Running with %s threads\n", threadCount); startAll(threads); joinAll(threads); } class WriteThread extends TestThread { private final int refCount; private long durationMs; public WriteThread(int id, int refCount) { super("WriteThread-" + id); setPriority(Thread.MAX_PRIORITY); this.refCount = refCount; } public void doRun() { GammaTxnLong[] refs = new GammaTxnLong[refCount]; for (int k = 0; k < refCount; k++) { refs[k] = makeReadBiased(new GammaTxnLong(stm)); } GammaTxnConfig config = new GammaTxnConfig(stm, refs.length); FatFixedLengthGammaTxn tx = new FatFixedLengthGammaTxn(config); long startMs = System.currentTimeMillis(); final long t = transactionsPerThread; for (int iteration = 0; iteration < t; iteration++) { for (int k = 0; k < refs.length; k++) { refs[k].openForWrite(tx, LOCKMODE_NONE).long_value++; } tx.commit(); tx.hardReset(); if (iteration % 100000000 == 0 && iteration > 0) { System.out.printf("Multiverse > %s is at %s\n", getName(), iteration); } } durationMs = System.currentTimeMillis() - startMs; System.out.printf("Multiverse > %s is finished in %s ms\n", getName(), durationMs); } } }