package org.multiverse.stms.gamma.integration.commute; import org.junit.Before; import org.junit.Test; import org.multiverse.TestThread; import org.multiverse.api.Txn; import org.multiverse.api.TxnExecutor; import org.multiverse.api.callables.TxnVoidCallable; import org.multiverse.api.functions.Functions; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.transactionalobjects.GammaTxnLong; import org.multiverse.stms.gamma.transactions.GammaTxn; import static org.multiverse.TestUtils.*; import static org.multiverse.api.GlobalStmInstance.getGlobalStmInstance; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; import static org.multiverse.stms.gamma.BenchmarkUtils.transactionsPerSecondAsString; public class UncontendedCommutePerformanceTest { private volatile boolean stop; private GammaStm stm; private GammaTxnLong ref; @Before public void setUp() { clearThreadLocalTxn(); stm = (GammaStm) getGlobalStmInstance(); ref = new GammaTxnLong(stm); } @Test public void withNormalIncrement() { NormalIncThread thread = new NormalIncThread(); startAll(thread); long durationMs = getStressTestDurationMs(30 * 1000); sleepMs(durationMs); stop = true; joinAll(thread); long transactionCount = ref.atomicGet(); String performance = transactionsPerSecondAsString(transactionCount, durationMs); System.out.println(performance + " Transactions/second"); } @Test public void withCommuteIncrement() { CommuteIncThread thread = new CommuteIncThread(); startAll(thread); long durationMs = getStressTestDurationMs(30 * 1000); sleepMs(durationMs); stop = true; joinAll(thread); long transactionCount = ref.atomicGet(); String performance = transactionsPerSecondAsString(transactionCount, durationMs); System.out.println(performance + " Transactions/second"); } public class NormalIncThread extends TestThread { public NormalIncThread() { super("NormalIncThread"); } @Override public void doRun() throws Exception { TxnExecutor executor = stm.newTxnFactoryBuilder() .setDirtyCheckEnabled(false) .newTxnExecutor(); TxnVoidCallable callable = new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { GammaTxn btx = (GammaTxn) tx; ref.openForWrite(btx, LOCKMODE_NONE).long_value++; } }; while (!stop) { executor.execute(callable); } } } public class CommuteIncThread extends TestThread { public CommuteIncThread() { super("CommuteIncThread"); } @Override public void doRun() throws Exception { TxnExecutor executor = stm.newTxnFactoryBuilder() .newTxnExecutor(); TxnVoidCallable callable = new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { GammaTxn btx = (GammaTxn) tx; ref.commute(btx, Functions.incLongFunction(1)); } }; while (!stop) { executor.execute(callable); } } } }