这是我的第一个JMH基准。我可能做错了什么,但是......
我的基准测试看起来像这样
@State(Scope.Benchmark) public class JmhBranchingBenchmark {
private static final int STRING_LENGTH = 100 * 1000;
private char[][] allQueries = new char[101][];
@Setup public void up() {
for (int i=0; i<allQueries.length; ++i) {
... fill char[i] with STRING_LENGTH chars
... this might take some time, but it's needed only once, or?
}
}
@GenerateMicroBenchmark public void measure5(BlackHole bh) {
bh.consume(countBreakingWhitespace(allQueries[5]));
}
... some more nearly identical methods as a poor man's replacement for caliper's @Param
}
我开始了......等待并等待然后将其杀死。我怀疑@Setup
中存在问题,所以我对其进行了简化,但没有任何改变。跑步开始非常乐观......
time -p java -jar target/microbenchmarks.jar ".*JmhBranchingBenchmark.*" -i 5 -f 1
# Run progress: 0.00% complete, ETA 00:02:05
# VM invoker: /usr/lib/jvm/java-7-oracle/jre/bin/java
# VM options: <none>
# Fork: 1 of 1
# Warmup: 20 iterations, 1 s each
# Measurement: 5 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.openjdk.jmh.samples.JmhBranchingBenchmark.measure10
# Warmup Iteration 1:
然后没有任何反应。经过很长一段时间,它会继续写下20行,如
# Warmup Iteration 1: 6.415 ops/ms
和5行像
Iteration 1: 6.506 ops/ms
然后输出一些结果
Result : 6.510 ±(99.9%) 0.030 ops/ms
Statistics: (min, avg, max) = (6.502, 6.510, 6.521), stdev = 0.008
Confidence interval (99.9%): [6.480, 6.540]
并更正其估计的eta:
# Run progress: 20.00% complete, ETA 00:26:52
我的@Setup
是否比我更频繁地被调用,或者还有什么可能是缓慢的原因?
答案 0 :(得分:4)
我认为你正在处理非常沉重的@Setup
。
@Setup(Level.Trial)
对象时, @State
被调用。这些初始化计入执行时间,这是进行预热的另一个好理由。因此,第一次预热期间的第一次“打嗝”是@Setup
执行。现在,JMH分支在单独的VM中运行每个@GenerateMicroBenchmark
,因此下一个测试将经历相同的操作。