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 "); 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 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(); } } }