简而言之,我的问题是:
分叉热身提供了什么,而分叉内热身没有?是什么让执行分叉热身变得有用?
JMH方便地允许您派生一个新的JVM实例,在该实例中运行基准测试。这很有用,因为正如本问题和本问题中所解释的,它允许您以全新的方式运行基准测试:一个新的操作系统进程,其中JVM和OS/系统的状态都没有针对运行基准测试的进程的先前决策/观察。
此外,JMH允许您执行一些初始的";"预热";在分叉过程中运行基准测试,其结果将被丢弃。这些是有用的;结算";在执行过程中做出决策(操作系统做出内存分页决策,JIT将VM代码编译为本机代码,等等(。
实际上有两种方法可以做到这一点:使用@Warmup
注释和使用@Fork
注释的warmups
参数。正如中所解释的,Fork中的预热属性和jmh中的预热注释之间有什么区别?前者在每个fork中执行一些初始迭代,而后者执行一些被丢弃的整个fork。
我很难理解为什么分叉热身被作为一个功能引入。分叉进程对OS/JVM提出了新的挑战,消除了现有进程中先前执行的代码可能产生的任何偏差。使分叉过程执行足够的预热迭代也意味着任何";初始优化";OS/JVM执行的操作被给予时间来"执行";结算";。
那么,我为什么要通过添加@Fork(warmups = N)
来运行一些被丢弃的整个叉子呢?我猜这与给OS/系统时间来解决一些问题有关(因为JVM不会在每个分叉之后都使用以前预热分叉中的信息(,但创建/拆除几次进程有助于改善结果是什么呢?如果要使用单个fork,为什么慷慨的@Warmup
注释不能实现同样的效果?
我很难理解为什么引入分叉预热功能。
预热叉可以执行以下操作:
- 通过打开和文件来缓存目录和文件
- 通过使脏页被写入并将页添加到空闲池来对虚拟存储器系统进行预充
- 初始化共享类缓存(如果JVM支持(
- 等等
这些东西肯定可以提高基准测试的一致性。
为什么要做多次?
我不清楚多个热身叉在练习中是否有帮助。。。或者为什么。但有能力尝试,以防它产生影响似乎是一件好事1。
添加预热分叉功能可能是因为至少有人想要/要求它。如果你可以运行一次预热分叉,那么选择N次可能是一个微不足道的扩展。
1-或者甚至提供它来给那些手头有太多时间的痴迷于表演的人另一个"机会";调谐旋钮";旋转