javascript - 循环是否会导致分支预测

标签 javascript arrays performance branch-prediction

我试图更好地理解导致 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/

相关文章:

php - 如何在 PHP 和 MySQL 中操作数组?

c - C 中的二维数组不起作用 - 运行时错误

python - 多机械化交易错误

objective-c - 可以接受从类外直接访问 ivar 以提高效率吗?

javascript - 如何粘贴我在剪贴板上复制的输入文本内容,按下 CSS 或 JS 按钮

用于防止所有 <a href> 链接的默认值的 Javascript 代码

arrays - 如何检索未包含在谷歌表格中另一列中的列中的值

javascript - 是否可以在没有类或 ID 的形式中设置 &lt;input type ="submit"> 的样式?

javascript - 我可以在 querySelectorAll 中使用正则表达式吗?

arrays - 二分查找运行时间