我试图更好地理解导致 branch prediction 的原因要计算的,什么都没有。
例如,我有一个包含 1 和 0 的数组。我想遍历这个数组,如果它读到 0 就做一些事情,但如果它读到 1 就做其他事情。
使用 JavaScript 看起来像这样:
var array = [0, 1, 1, 1, 0, 0, 0];
for(i=0; i < array.length; i++){
if(array[i] == 0){
// Do The 0 Instruction
}else{
// Do The 1 Instruction
}
}
我知道这会导致进行分支预测,因为程序在从数组中读取数据之前不知道需要采取什么步骤。
但是,如果我对数组进行预处理以将多个连续的 1 或 0 组合成一个数字会怎样。因此,例如数组将更改为:
var array = [0, 1, 1, 1, 0, 0, 0];
var condensedArray = [1, 3, 3];
现在我可以使用这样的循环,而不是使用 if 语句来分支我的指令:
var condensedArray = [1, 3, 3];
for(i=0; i < condensedArray.length; i+=2){
for(j=0; j < condensedArray[i]; j++)
//Do The 0 Instruction
for(j=0; j < condensedArray[i+1]; j++)
//Do The 1 Instruction
}
这是否仍然导致分支预测被计算和错过?如果是这样,使用 if 语句测试原始数组的每个索引是否至少更有效?
编辑: 在评论中有人问我如何知道数组是以 0 还是 1 开头?为简单起见,我将其排除在外,并且不想编辑上面的代码以使其更长,但我会在程序开头有一个 if 语句,说明数组是否以 0 或 1 开头。然后那个单一的branch 会将循环按正确的顺序排列。
最佳答案
基准测试可以判断 CPU 是否对此类代码进行分支预测。当您创建两个退出条件相当容易预测的循环时,CPU 可能能够在那里进行分支预测。
关于javascript - 循环是否会导致分支预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959874/