How long does a microbenchmark need to run?
首先,这不是关于微基准的有用性。我很清楚它们的目的:指出性能特征并在非常具体的情况下进行比较,以突出一个方面。这是否会对你的工作产生影响是另一回事。
几年前,有人(我想是海因茨·卡布兹?)注意到每个值得花时间查看其结果的基准都必须运行至少几分钟,并且至少需要运行3次,而第一次运行总是被丢弃。这就解释了JVM的预热以及环境中的不一致(后台进程、网络流量等)和测量不准确。这对我来说是有意义的,我的个人经历也提出了类似的建议,所以我总是采用这种策略。
但是,我注意到许多人(例如Jeff)编写的基准测试只运行几毫秒(!)只运行一次。我知道近几年来短跑基准的准确性有所提高,但我仍然觉得很奇怪。难道每个微基准都不应该运行至少一秒钟,并且至少运行3次以获得某种有用的输出吗?或者这条规则现在已经过时了?
根据我的经验,你需要:
- 多次运行(并放弃第一个结果-vm和其他效果)
- 如果您要查看计算密集型代码,请花最少的时间
- 运行足够长的时间以降低循环和定时功能的成本
- 理想情况下,在一个OS时间片(通常为10 ms)内运行,或运行一个以上的时间片,例如运行约5 ms或约500 ms。
我只倾向于使用计算密集型代码——如果您有不同的配置文件(例如内存密集型或大量I/O),那么时间策略可能需要不同。