summaryrefslogtreecommitdiff
path: root/src/main/java/bench/SingleBench.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bench/SingleBench.java')
-rw-r--r--src/main/java/bench/SingleBench.java84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/main/java/bench/SingleBench.java b/src/main/java/bench/SingleBench.java
new file mode 100644
index 0000000..2ce39eb
--- /dev/null
+++ b/src/main/java/bench/SingleBench.java
@@ -0,0 +1,84 @@
+package bench;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class SingleBench {
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 5) {
+ System.err.println("Usage: SingleBench <configName> <threads> <durationSec> <warmupSec> <msgSize>");
+ System.exit(1);
+ }
+
+ String configName = args[0];
+ int threadCount = Integer.parseInt(args[1]);
+ long durationSec = Long.parseLong(args[2]);
+ long warmupSec = Long.parseLong(args[3]);
+ int msgSize = Integer.parseInt(args[4]);
+
+ String message = "X".repeat(msgSize);
+ int messageBytes = message.getBytes().length;
+
+ Logger logger = LogManager.getLogger("bench");
+
+ CountDownLatch startLatch = new CountDownLatch(1);
+ AtomicBoolean running = new AtomicBoolean(true);
+ AtomicLong eventCounter = new AtomicLong(0);
+
+ List<Thread> threads = new ArrayList<>();
+ for (int i = 0; i < threadCount; i++) {
+ Thread t = new Thread(() -> {
+ try {
+ startLatch.await();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return;
+ }
+ while (running.get()) {
+ logger.info(message);
+ eventCounter.incrementAndGet();
+ }
+ });
+ t.start();
+ threads.add(t);
+ }
+
+ // Warmup phase
+ startLatch.countDown();
+ if (warmupSec > 0) {
+ Thread.sleep(warmupSec * 1000);
+ eventCounter.set(0);
+ }
+
+ long startTime = System.nanoTime();
+ Thread.sleep(durationSec * 1000);
+ running.set(false);
+ long endTime = System.nanoTime();
+
+ for (Thread t : threads) {
+ t.join(5000);
+ }
+
+ long events = eventCounter.get();
+ double duration = (endTime - startTime) / 1_000_000_000.0;
+ double eventsPerSec = events / duration;
+ double mbPerSec = (events * messageBytes) / duration / (1024 * 1024);
+
+ // Output CSV line: config,threads,events,duration,events_per_sec,mb_per_sec
+ System.out.printf("%s,%d,%d,%.2f,%.0f,%.2f%n",
+ configName, threadCount, events, duration, eventsPerSec, mbPerSec);
+
+ // Only flush/shutdown if requested (default: no flush for max perf)
+ boolean doFlush = Boolean.getBoolean("bench.flush");
+ if (doFlush) {
+ LogManager.shutdown();
+ }
+ }
+}