为什么 if(1) 比 if(true) 快

Spe*_*ecy 1 javascript arrays performance v8

我正在尝试在 JavaScript 和画布中制作康威的生活游戏,我有一个 1280x720 的矩阵用于存储单元格数据,我目前将数据存储为 1 = 活着,0 = 死了,然后当我检查如果一个细胞还活着,我只是这样做:if(matrix[i][j]) 我很好奇这是否可以改进,并在https://jsbench.me/ 上做了一些测试, 复制了一个类似的场景,并注意到如果使用“true/false”,整个​​事情+-11% 慢,为什么会这样?不是应该更快吗?

示例基准,只需将 1 更改为 true 即可测试其他场景

let array = []
for(let i = 0; i<1000000; i++){
   array.push(1)
}
let sum = 0
for(let i = 0; i<1000000;i++){
    if(array[i]){
        sum++
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*rts 6

您看到的性能差异并非严格由于if语句评估,而是由于访问值 ( 1or true)的数组元素类型。V8 引擎区分不同元素类型的数组。的数组1将被视为PACKED_SMI_ELEMENTS,而 的数组true将被视为PACKED_ELEMENTS。因此,使用布尔元素的版本会慢一点。

举例来说,这是在数组元素类型之间应用的相对性能优化的格子,左上角性能最佳,右下角性能最差:

元素种类格子

而且这里有一个基准比较两者的测试,以一个我添加基于以下我的评论

基准结果