gpt4 book ai didi

javascript - 为什么在 V8 中使用此代码片段 <= 比 < 慢?

转载 作者:IT老高 更新时间:2023-10-28 13:16:44 26 4
gpt4 key购买 nike

我正在阅读幻灯片 Breaking the Javascript Speed Limit with V8 ,并且有一个类似下面代码的示例。我不知道为什么<=< 慢在这种情况下,任何人都可以解释一下吗?任何意见表示赞赏。

慢:

this.isPrimeDivisible = function(candidate) {
for (var i = 1; i <= this.prime_count; ++i) {
if (candidate % this.primes[i] == 0) return true;
}
return false;
}

(提示:primes 是一个长度为 prime_count 的数组)

更快:

this.isPrimeDivisible = function(candidate) {
for (var i = 1; i < this.prime_count; ++i) {
if (candidate % this.primes[i] == 0) return true;
}
return false;
}

[More Info]速度提升显着,在我本地环境测试,结果如下:

V8 version 7.3.0 (candidate) 

慢:

 time d8 prime.js
287107
12.71 user
0.05 system
0:12.84 elapsed

更快:

time d8 prime.js
287107
1.82 user
0.01 system
0:01.84 elapsed

最佳答案

其他答案和评论提到两个循环之间的区别在于第一个循环比第二个循环多执行一次迭代。这是真的,但在一个增长到 25,000 个元素的数组中,一次迭代或多或少只会产生微乎其微的差异。作为一个大概的猜测,如果我们假设它增长的平均长度是 12,500,那么我们可能预期的差异应该在 1/12,500 左右,或者只有 0.008%。

这里的性能差异比额外的一次迭代所解释的要大得多,并且该问题在演示文稿的结尾处进行了解释。

this.primes是一个连续的数组(每个元素都有一个值),元素都是数字。

JavaScript 引擎可以将这样的数组优化为一个简单的实际数字数组,而不是一个恰好包含数字但可能包含其他值或不包含值的对象数组。第一种格式访问起来要快得多:它需要更少的代码,并且数组要小得多,因此它更适合缓存。但是有一些条件可能会阻止使用这种优化的格式。

一种情况是缺少某些数组元素。例如:

let array = [];
a[0] = 10;
a[2] = 20;

现在a[1] 的值是多少? ?它没有值(value)。 (说它具有值 undefined 甚至是不正确的 - 包含 undefined 值的数组元素与完全缺失的数组元素不同。)

没有办法只用数字来表示它,因此 JavaScript 引擎被迫使用优化程度较低的格式。如果 a[1]与其他两个元素一样包含数值,因此该数组可能会优化为仅由数字组成的数组。

数组被强制为去优化格式的另一个原因可能是您尝试访问数组边界之外的元素,如演示文稿中所述。

<= 的第一个循环尝试读取超出数组末尾的元素。该算法仍然可以正常工作,因为在最后一次额外的迭代中:

  • this.primes[i]计算结果为 undefined因为i超出数组末尾。
  • candidate % undefined (对于 candidate 的任何值)计算结果为 NaN .
  • NaN == 0计算结果为 false .
  • 因此,return true未执行。

所以就好像额外的迭代从未发生过一样——它对其余的逻辑没有影响。代码产生的结果与没有额外迭代的结果相同。

但要到达那里,它会尝试读取数组末尾不存在的元素。这会迫使阵列退出优化 - 或者至少在本次演讲时是这样。

< 的第二个循环只读取数组中存在的元素,因此它允许优化数组和代码。

pages 90-91 中描述了该问题。演讲的内容,以及之前和之后的页面中的相关讨论。

我碰巧参加了这个 Google I/O 演示,之后与演讲者(V8 作者之一)进行了交谈。我一直在我自己的代码中使用一种技术,该技术涉及读取数组末尾的内容,这是一种错误的(事后看来)尝试优化特定情况的尝试。他证实,如果您尝试读取数组的末尾,它会阻止使用简单的优化格式。

如果 V8 作者所说的仍然是正确的,那么读取数组末尾会阻止它被优化,它必须回退到较慢的格式。

现在有可能 V8 已同时改进以有效处理这种情况,或者其他 JavaScript 引擎以不同方式处理它。我不知道其中的一种方式,但这种去优化正是演示文稿所谈论的。

关于javascript - 为什么在 V8 中使用此代码片段 <= 比 < 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com