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
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user