JMH - 奇怪的基准测试结果

Tri*_*yen 5 java benchmarking microbenchmark jmh

我正在使用 JMH 对 DOM 解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快

在此处输入图片说明

在此处输入图片说明

谁能解释为什么会发生这种情况?另外,百分位数和所有数字是什么意思,为什么它在第三次迭代后开始变得稳定?一次迭代是否意味着整个基准测试方法的一次迭代?下面是我正在运行的方法

@Benchmark 
@BenchmarkMode(Mode.SingleShotTime) 
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 13, time = 1, timeUnit = TimeUnit.MILLISECONDS)
public void testMethod_no_attr() {
    try {
        File fXmlFile = new File("500000-6.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
    } catch (Exception  e) {
        e.printStackTrace();  
    }
}
Run Code Online (Sandbox Code Playgroud)

die*_*ter 1

您的屏幕截图缺少直方图输出。\n您看到的只是直方图的百分位数

\n

检查这个例子。我们进行了 100 次迭代,方法BoolArrayVsBitSetBenchmark#primitive的结果 是:

\n
Result "de.jawb.jmh.benchmark.example.bool.BoolArrayVsBitSetBenchmark.primitive":\n  N = 100\n  mean =      0,493 \xc2\xb1(99.9%) 0,003 s/op\n\n  Histogram, s/op:\n    [0,490, 0,495) = 93\n    [0,495, 0,500) = 3\n    [0,500, 0,505) = 1\n    [0,505, 0,510) = 1\n    [0,510, 0,515) = 0\n    [0,515, 0,520) = 0\n    [0,520, 0,525) = 1\n    [0,525, 0,530) = 0\n    [0,530, 0,535) = 0\n    [0,535, 0,540) = 0\n    [0,540, 0,545) = 0\n    [0,545, 0,550) = 0\n    [0,550, 0,555) = 0\n    [0,555, 0,560) = 1\n\n  Percentiles, s/op:\n      p(0,0000) =      0,490 s/op \n     p(50,0000) =      0,491 s/op\n     p(90,0000) =      0,494 s/op\n     p(95,0000) =      0,496 s/op\n     p(99,0000) =      0,558 s/op\n     p(99,9000) =      0,559 s/op\n     p(99,9900) =      0,559 s/op\n     p(99,9990) =      0,559 s/op\n     p(99,9999) =      0,559 s/op\n    p(100,0000) =      0,559 s/op\n
Run Code Online (Sandbox Code Playgroud)\n

第一条直方图线[0,490, 0,495) = 93表示 93 个调用属于max 0,490smin 0,494s组。注意括号\')\'

\n

总之,这意味着没有调用比 0,491 s/op 更快,因为

\n
\n

p(0,0000) = 0,490 秒/操作

\n
\n

最大执行时间为 0,559 s/op,因为

\n
\n

p(100,0000) = 0,559 s/op

\n
\n