OpenJDK / code-tools / jmh
changeset 586:cde312963a3d
generators: make BenchmarkMode.SampleTime timestamps much rarer for very fast benchmarks, scalability bottleneck otherwise.
author | shade |
---|---|
date | Thu, 24 Apr 2014 01:46:56 +0400 |
parents | b4c138dc774a |
children | f873cd3c40ce |
files | jmh-core/src/main/java/org/openjdk/jmh/generators/core/BenchmarkGenerator.java |
diffstat | 1 files changed, 8 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/jmh-core/src/main/java/org/openjdk/jmh/generators/core/BenchmarkGenerator.java Wed Apr 23 23:52:45 2014 +0400 +++ b/jmh-core/src/main/java/org/openjdk/jmh/generators/core/BenchmarkGenerator.java Thu Apr 24 01:46:56 2014 +0400 @@ -476,6 +476,8 @@ writer.println(); generatePadding(writer); + writer.println(ident(1) + "int startRndMask;"); + StateObjectHandler states = new StateObjectHandler(compilerControl); // benchmark instance is implicit @@ -830,8 +832,9 @@ } // measurement loop call + writer.println(ident(2) + "int targetSamples = (int) (control.getDuration(TimeUnit.MILLISECONDS) * 20); // at max, 20 timestamps per millisecond"); writer.println(ident(3) + "SampleBuffer buffer = new SampleBuffer();"); - writer.println(ident(3) + method.getName() + "_" + benchmarkKind + "_measurementLoop(control, buffer, " + states.getImplicit("bench").toLocal() + ", " + states.getImplicit("blackhole").toLocal() + prefix(states.getArgList(method)) + ");"); + writer.println(ident(3) + method.getName() + "_" + benchmarkKind + "_measurementLoop(control, buffer, targetSamples, " + states.getImplicit("bench").toLocal() + ", " + states.getImplicit("blackhole").toLocal() + prefix(states.getArgList(method)) + ");"); // control objects get a special treatment for (StateObject so : states.getControls()) { @@ -874,10 +877,10 @@ writer.println(ident(1) + "@" + CompilerControl.class.getSimpleName() + "(" + CompilerControl.class.getSimpleName() + "." + CompilerControl.Mode.class.getSimpleName() + "." + CompilerControl.Mode.DONT_INLINE + ")"); - writer.println(ident(1) + "public" + (methodGroup.isStrictFP() ? " strictfp" : "") + " void " + method.getName() + "_" + benchmarkKind + "_measurementLoop" + "(InfraControl control, SampleBuffer buffer, " + states.getImplicit("bench").toTypeDef() + ", " + states.getImplicit("blackhole").toTypeDef() + prefix(states.getTypeArgList(method)) + ") throws Throwable {"); + writer.println(ident(1) + "public" + (methodGroup.isStrictFP() ? " strictfp" : "") + " void " + method.getName() + "_" + benchmarkKind + "_measurementLoop" + "(InfraControl control, SampleBuffer buffer, int targetSamples, " + states.getImplicit("bench").toTypeDef() + ", " + states.getImplicit("blackhole").toTypeDef() + prefix(states.getTypeArgList(method)) + ") throws Throwable {"); writer.println(ident(2) + "long realTime = 0;"); writer.println(ident(2) + "int rnd = (int)System.nanoTime();"); - writer.println(ident(2) + "int rndMask = 0;"); + writer.println(ident(2) + "int rndMask = startRndMask;"); writer.println(ident(2) + "long time = 0;"); writer.println(ident(2) + "int currentStride = 0;"); writer.println(ident(2) + "do {"); @@ -892,7 +895,7 @@ writer.println(ident(3) + "" + emitCall(method, states) + ';'); writer.println(ident(3) + "if (sample) {"); writer.println(ident(4) + "buffer.add(System.nanoTime() - time);"); - writer.println(ident(4) + "if (currentStride++ > 1000000) {"); + writer.println(ident(4) + "if (currentStride++ > targetSamples) {"); writer.println(ident(5) + "buffer.half();"); writer.println(ident(5) + "currentStride = 0;"); writer.println(ident(5) + "rndMask = (rndMask << 1) + 1;"); @@ -902,6 +905,7 @@ invocationEpilog(writer, 3, method, states, true); writer.println(ident(2) + "} while(!control.isDone);"); + writer.println(ident(2) + "startRndMask = Math.max(startRndMask, rndMask);"); writer.println(ident(1) + "}"); writer.println();