3

问题1:为什么JMH比简单更好System.getNanotime()

问题 2:我可以从结果中得出什么结论(看benchmarking results部分)除了validateLongKeyBinary比 快 64%validateLongKeyAscii吗?

示例(代码):

import net.spy.memcached.util.StringUtils;
import org.openjdk.jmh.annotations.GenerateMicroBenchmark;

public class KeyBench {

private static final String LONG_KEY = "thisIsAFunkyKeyWith_underscores_AndAlso334" +
            "3252545345NumberslthisIsAFunkyKeyWith_underscores_AndAlso3343252545345Numbe" +
            "rslthisIsAFunkyKeyWith_underscores_AndAlso3343252545345NumberslthisIsAFunkyK" +
            "eyWith_underscores_AndAlso3343252545345Numbersl";


    @GenerateMicroBenchmark
    public void validateLongKeyBinary() {
        StringUtils.validateKey(LONG_KEY, true);
    }

    @GenerateMicroBenchmark
    public void validateLongKeyAscii() {
        StringUtils.validateKey(LONG_KEY, false);
    }
}

基准测试结果

# Running: benchmarks.KeyBench.validateLongKeyAscii

Result : 393,667 ±(95%) 13,985 ±(99%) 20,094 ops/ms
  Statistics: (min, avg, max) = (357,445, 393,667, 413,004), stdev = 19,552
  Confidence intervals: 95% [379,682, 407,653], 99% [373,573, 413,762]


# Running: benchmarks.KeyBench.validateLongKeyBinary

Result : 644,023 ±(95%) 6,881 ±(99%) 9,887 ops/ms
  Statistics: (min, avg, max) = (621,784, 644,023, 654,178), stdev = 9,620
  Confidence intervals: 95% [637,142, 650,904], 99% [634,136, 653,910]

Benchmark                             Mode Thr     Count  Sec         Mean   Mean error    Units
b.KeyBench.validateLongKeyAscii      thrpt   1        10    1      393,667       20,094   ops/ms
b.KeyBench.validateLongKeyBinary     thrpt   1        10    1      644,023        9,887   ops/ms
4

1 回答 1

14

JMH 维护者在这里。

让我问一个主要问题:如果您可以自己编写大部分内容,为什么还要使用该库?答案其实很简单:当然你可以在无限的时间里写任何东西,但实际上我们必须重用代码以适应合理的时间。

现在,似乎只有在代码周围有两个时间戳就足以衡量其性能。但是,您必须控制您正在测量的确切内容,例如您是否仍处于过渡预热阶段,您的代码是否实际执行或您在优化后测量空壳,您的效果在统计上有多显着等等等等. 好的基准框架试图帮助解决这个问题。

您可以通过查看JMH 示例、我们的基准测试会谈或相关的 SO 答案来了解您将不得不面对的问题。哦,使用 nanoTime 比你想象的要难

于 2014-05-06T11:32:53.900 回答