如何用Java编写(并运行)正确的微基准测试?
我正在寻找一些代码示例和注释,以说明需要考虑的各种事情。
示例:基准测试应该测量时间/迭代还是迭代/时间,为什么?
相关:秒表基准测试是可接受的?
如何用Java编写(并运行)正确的微基准测试?
我正在寻找一些代码示例和注释,以说明需要考虑的各种事情。
示例:基准测试应该测量时间/迭代还是迭代/时间,为什么?
相关:秒表基准测试是可接受的?
当前回答
确保以某种方式使用在基准代码中计算的结果。否则你的代码会被优化掉。
其他回答
Java基准测试的重要事项是:
Warm up the JIT first by running the code several times before timing it Make sure you run it for long enough to be able to measure the results in seconds or (better) tens of seconds While you can't call System.gc() between iterations, it's a good idea to run it between tests, so that each test will hopefully get a "clean" memory space to work with. (Yes, gc() is more of a hint than a guarantee, but it's very likely that it really will garbage collect in my experience.) I like to display iterations and time, and a score of time/iteration which can be scaled such that the "best" algorithm gets a score of 1.0 and others are scored in a relative fashion. This means you can run all algorithms for a longish time, varying both number of iterations and time, but still getting comparable results.
我正在写一篇关于。net基准测试框架设计的博客。我有一些以前的帖子,也许能给你一些想法——当然,不是每件事都合适,但其中一些可能是合适的。
我知道这个问题已经被标记为已回答,但我想提到两个帮助我们编写微基准的库
来自谷歌的卡尺
入门教程
http://codingjunkie.net/micro-benchmarking-with-caliper/ http://vertexlabs.co.uk/blog/caliper
来自OpenJDK的JMH
入门教程
避免JVM上的基准测试陷阱 使用JMH进行Java微基准测试 JMH简介
在Java中编写微基准测试有许多可能的陷阱。
首先:你必须计算各种随机占用时间的事件:垃圾收集、缓存效果(OS对文件的缓存效果和CPU对内存的缓存效果)、IO等。
第二:对于非常短的时间间隔,您不能相信测量时间的准确性。
第三:JVM在执行时优化代码。因此,在同一个jvm实例中不同的运行将变得越来越快。
My recommendations: Make your benchmark run some seconds, that is more reliable than a runtime over milliseconds. Warm up the JVM (means running the benchmark at least once without measuring, that the JVM can run optimizations). And run your benchmark multiple times (maybe 5 times) and take the median-value. Run every micro-benchmark in a new JVM-instance (call for every benchmark new Java) otherwise optimization effects of the JVM can influence later running tests. Don't execute things, that aren't executed in the warmup-phase (as this could trigger class-load and recompilation).
http://opt.sourceforge.net/ Java Micro Benchmark -确定不同平台上计算机系统的比较性能特征所需的控制任务。可用于指导优化决策和比较不同的Java实现。
jmh是最近添加到OpenJDK的,是由Oracle的一些性能工程师编写的。当然值得一看。
jmh是一个Java工具,用于构建、运行和分析用Java和其他针对JVM的语言编写的纳米/微/宏基准测试。
样本测试注释中隐藏着非常有趣的信息。
参见:
避免JVM上的基准测试陷阱 讨论jmh的主要优势。