很难说出为什么
Math.max比a慢
Ops.max,但是很容易说出为什么该基准测试强烈支持分支到条件移动:在
n-th迭代中,
Math.max( array[i], max );
不等于是大于所有先前元素
max的概率
array[n-1]。显然,这种可能性变得更低,并降低增长
n并给予
final int[] array = new int[(8*1024*1024)/4];
在大多数情况下,它几乎可以忽略不计。条件移动指令对分支概率不敏感,它总是花费相同的时间来执行。 如果 分支很难预测, 则
条件移动指令比分支预测快。另一方面,如果可以高概率很好地预测分支,则分支预测会更快。目前,我不确定条件转移的速度与分支的最佳和最差情况相比。1个
在您的情况下,除了前几个分支外,所有分支都是可以预测的。从大约
n ==10开始,使用条件移动是没有意义的,因为可以肯定地保证了分支的正确预测,并且可以与其他指令并行执行(我猜您每次迭代只需要一个周期)。
这似乎发生在算法计算最小值/最大值或进行一些低效率的排序时(好的分支可预测性意味着每步熵低)。
1条件移动和预测分支都需要一个周期。前者的问题在于它需要两个 *** 作数,这需要额外的指令。最后,当分支单元空闲时,关键路径可能会变长和/或ALU饱和。通常,但并非总是如此,在实际应用中可以很好地预测分支。这就是为什么首先创建分支预测的原因。
至于定时条件移动与分支预测最佳和最差情况的详细信息,请参见下面的评论讨论。我的我自己的基准表明,有条件的举动是显著比分支预测时更快分支预测遇到的最糟糕的情况,但我不能忽视矛盾的结果。我们需要一些解释到底是什么与众不同。一些其他基准和/或分析可能会有所帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)