Files
javademos/jdk27-perf/scripts/Load.java
T
asmhatreandClaude Sonnet 5.5 d565be93c6 Add jdk27-perf: the same Spring Boot service measured on JDK 25 and JDK 27
Live heap, throughput, p99 and startup across four configurations, including opt-in and opt-out of
compact object headers.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01WzVQ6zFh9cuLPj9RSbRH8U
2026-10-12 17:30:55 +00:00

43 lines
2.2 KiB
Java

import java.net.URI;
import java.net.http.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
/** Closed-loop load: THREADS threads, WARMUP seconds discarded, then MEASURE seconds recorded. */
public class Load {
public static void main(String[] a) throws Exception {
int port = Integer.parseInt(a[0]), warmup = Integer.parseInt(a[1]), measure = Integer.parseInt(a[2]), threads = Integer.parseInt(a[3]);
HttpClient c = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
HttpRequest rq = HttpRequest.newBuilder(URI.create("http://localhost:" + port + "/quote?n=200")).build();
long start = System.nanoTime();
long measureFrom = start + warmup * 1_000_000_000L, end = measureFrom + measure * 1_000_000_000L;
List<long[]> perThread = new CopyOnWriteArrayList<>();
ExecutorService ex = Executors.newFixedThreadPool(threads);
List<Future<?>> fs = new ArrayList<>();
for (int t = 0; t < threads; t++) fs.add(ex.submit(() -> {
long[] buf = new long[2_000_000]; int n = 0;
try {
while (true) {
long s = System.nanoTime();
if (s >= end) break;
c.send(rq, HttpResponse.BodyHandlers.discarding());
long e = System.nanoTime();
if (s >= measureFrom && n < buf.length) buf[n++] = e - s;
}
} catch (Exception e) { throw new RuntimeException(e); }
perThread.add(Arrays.copyOf(buf, n));
return null;
}));
for (Future<?> f : fs) f.get();
ex.shutdown();
long total = 0; for (long[] b : perThread) total += b.length;
long[] all = new long[(int) total]; int p = 0;
for (long[] b : perThread) { System.arraycopy(b, 0, all, p, b.length); p += b.length; }
Arrays.sort(all);
System.out.printf("requests=%d throughput=%.0f req/s p50=%.2f ms p99=%.2f ms p99.9=%.2f ms max=%.2f ms%n",
total, total / (double) measure, all[(int) (total * 0.50)] / 1e6, all[(int) (total * 0.99)] / 1e6,
all[(int) (total * 0.999)] / 1e6, all[(int) total - 1] / 1e6);
}
}