1
0

perf test

This commit is contained in:
2024-11-18 17:30:29 +03:00
parent 6132d37303
commit 6c23a1c606

View File

@@ -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;
}
}