perf test
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import ru.lionarius.api.CurrencyExchange;
|
||||
import ru.lionarius.api.client.Client;
|
||||
@@ -14,15 +15,19 @@ import java.util.Set;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public class PerformanceTest {
|
||||
|
||||
@Test
|
||||
public void compareQueuePlainPerformance() throws Exception {
|
||||
private Set<CurrencyPair> pairs;
|
||||
private final int numTraders = 50;
|
||||
private final int numOrders = 1000;
|
||||
private ExecutorService executorService;
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
var BTC = new Currency("BTC");
|
||||
var ETH = new Currency("ETH");
|
||||
var USD = new Currency("USD");
|
||||
var RUB = new Currency("RUB");
|
||||
|
||||
var pairs = Set.of(
|
||||
pairs = Set.of(
|
||||
new CurrencyPair(BTC, USD),
|
||||
new CurrencyPair(ETH, USD),
|
||||
new CurrencyPair(USD, BTC),
|
||||
@@ -34,22 +39,30 @@ public class PerformanceTest {
|
||||
new CurrencyPair(RUB, BTC),
|
||||
new CurrencyPair(RUB, ETH)
|
||||
);
|
||||
|
||||
var plainExchange = new PlainCurrencyExchange(pairs);
|
||||
var queueExchange = new QueueCurrencyExchange(pairs);
|
||||
|
||||
var numTraders = 500;
|
||||
var numOrders = 1000;
|
||||
|
||||
var plainTime = benchmark(numTraders, numOrders, plainExchange, pairs);
|
||||
var queueTime = benchmark(numTraders, numOrders, queueExchange, pairs);
|
||||
|
||||
queueExchange.shutdown();
|
||||
|
||||
System.out.printf("Direct implementation: %.2f orders/sec%n", plainTime);
|
||||
System.out.printf("Queue implementation: %.2f orders/sec%n", queueTime);
|
||||
|
||||
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
@Test
|
||||
void plainPerformanceTest() throws Exception {
|
||||
var exchange = new PlainCurrencyExchange(pairs);
|
||||
|
||||
var time = benchmark(numTraders, numOrders, exchange, pairs);
|
||||
|
||||
System.out.printf("Plain implementation: %.2f orders/sec%n", time);
|
||||
}
|
||||
|
||||
@Test
|
||||
void queuePerformanceTest() throws Exception {
|
||||
var exchange = new QueueCurrencyExchange(pairs);
|
||||
|
||||
var time = benchmark(numTraders, numOrders, exchange, pairs);
|
||||
|
||||
exchange.shutdown();
|
||||
|
||||
System.out.printf("Queue implementation: %.2f orders/sec%n", time);
|
||||
}
|
||||
|
||||
double benchmark(int numTraders, int numOrders, CurrencyExchange exchange, Set<CurrencyPair> pairs) throws InterruptedException {
|
||||
var buyers = new ArrayList<Client>();
|
||||
var sellers = new ArrayList<Client>();
|
||||
@@ -84,7 +97,12 @@ public class PerformanceTest {
|
||||
var randomPair = pairs.get(random.nextInt(pairs.size()));
|
||||
var buyAmount = random.nextInt(100) + 1;
|
||||
var sellAmount = random.nextInt(100) + 1;
|
||||
futures.add(exchange.placeOrder(seller.id(), randomPair, OrderType.SELL, buyAmount, sellAmount));
|
||||
|
||||
var future = CompletableFuture.runAsync(() -> {
|
||||
exchange.placeOrder(seller.id(), randomPair, OrderType.SELL, buyAmount, sellAmount);
|
||||
}, executorService);
|
||||
|
||||
futures.add(future);
|
||||
orders += 1;
|
||||
}
|
||||
}
|
||||
@@ -94,7 +112,12 @@ public class PerformanceTest {
|
||||
var randomPair = pairs.get(random.nextInt(pairs.size()));
|
||||
var buyAmount = random.nextInt(100) + 1;
|
||||
var sellAmount = random.nextInt(100) + 1;
|
||||
futures.add(exchange.placeOrder(buyer.id(), randomPair, OrderType.BUY, sellAmount, buyAmount));
|
||||
|
||||
var future = CompletableFuture.runAsync(() -> {
|
||||
exchange.placeOrder(buyer.id(), randomPair, OrderType.BUY, sellAmount, buyAmount);
|
||||
}, executorService);
|
||||
|
||||
futures.add(future);
|
||||
orders += 1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user