知识卡片
基准测试防幻觉
内容
Java性能实验要防止编译器删除无效果代码,也要考虑JIT预热,否则测到的可能是虚拟机行为而非算法差异。发散:复杂度给方向,基准测试给现实,但测试本身也需要设计。
参考来源
- 位置:《你真的会写代码吗-2021》第3章《速度的要求:时间效率》"基准测试"专栏(源文件:_epub-src/OEBPS/Text/0013.xhtml)
- 结论依据:原文明确"编译器和虚拟机都可能会对程序进行不少修改,从而掩盖了真实的测试结果",列举"如果编译器发现某些代码没有实际的效果,则会跳过执行这些代码"和"即时编译"两类干扰,并给出让每次操作产生实际效果、先做空运行预热的应对办法。
- 原始内容:编译器和虚拟机都可能会对程序进行不少修改,从而掩盖了真实的测试结果。例如:如果编译器发现某些代码没有实际的效果,则会跳过执行这些代码。虚拟机可以在解释执行字节码和将其编译为本地代码之间来回切换(称为即时编译)……先运行几次要进行基准测试的代码,然后再开始正式的测试。这些所谓的空运行会促使虚拟机编译一些性能敏感的代码,让测试时间更有意义。