提问者:小点点

JMH什么都不做的时候做什么?


这是我的第一个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
}

是我开始的...等了又等,然后杀了它。我怀疑在< code>@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是否比我想象的更频繁地被调用,或者还有什么其他原因导致了缓慢?


共1个答案

匿名用户

我认为你正在处理非常沉重的@Setup

< code>@Setup(级别。Trial)变懒-在第一次使用< code>@State对象时调用。这些初始化被计入执行时间,这是进行预热的另一个好理由。因此,第一次预热期间的第一次“打嗝”是执行< code>@Setup。现在,JMH将每个< code > @ GenerateMicroBenchmark 运行分支到单独的VM中,因此下一个测试将会经历相同的情况。