gpt4 book ai didi

javascript - 谁能解释一下这个循环是如何达到如此高的基准的?

转载 作者:数据小太阳 更新时间:2023-10-29 04:10:45 25 4
gpt4 key购买 nike

http://jsperf.com/loops/67

如果你看,下面的循环管理着一些疯狂的基准测试:

var i=0;
var v;
for (i, v; v = arr[i++];) {
v;
}

它在 FF 中得分约为 7 亿操作/秒,在 Chrome 中得分约为 2000 万,在 IE10 中得分约为 5000 万。下一个最快的循环在 FF 中管理大约 100k,在 IE10 中管理大约 6k,在 Chrome 中管理大约 2k。

为什么这么快?我可以看到其他循环之间的明显差异以及一个比另一个更快,但我想不出任何可以解释这个循环绝对令人兴奋的性能差异的东西,7 亿到 100k 是一个疯狂的差距。


回答后编辑:

根据@Michael Gary 的回答,我返回并编辑了设置以包含一个实际的真实数组,结果又回到了现实:http://jsperf.com/loops/70

最佳答案

原因很简单。数组 arr 使用以下代码创建:

var arr = new Array(10000);

因此它的长度为 10000,但所有元素都是未定义。此循环不会超出数组长度,但会在遇到“虚假”值时终止 - 假设循环将在 v 收到 undefined 值时停止作为尝试读取数组末尾的结果。

但是在这个特定的数组中,所有一万个元素的值都是undefined。所以循环在测试数组的第一个元素时停止。换句话说,它根本不循环!怪不得这么快。

但是更真实的案例呢?这种循环如何处理冗长的 JSON 对象数组:

[
{ "id": 507674, "name": "Kolink" },
{ "id": 997356, "name": "DarkLord7854" },
{ "id": 1202830, "name": "Michael Geary" },
/* and thousands more */
]

这里没有循环立即终止的问题,因为数组元素都是“真实的”。

事实证明,对于现代 JavaScript 引擎来说,这是一种相当糟糕的编写循环的方法,正如我最近发现的,这让我感到极度尴尬。

我是 jQuery Cookbook 的作者之一:我写了第 5 章的大部分内容,“更快、更简单、更有趣”。好吧,“更快”的部分并没有那么好。我推荐了一个非常像你的循环来遍历像上面这样的大量对象:

for( var item, i = -1;  item = array[++i]; ) {
// do stuff with item
}

事实证明,在现代浏览器中,这比像这样的传统循环要慢很多:

for( var i = 0, n = array.length;  i < n;  i++ ) {
var item = array[i];
// do stuff with item
}

这部分是由于尝试读取数组末尾的事实会使一些 JavaScript 引擎返回到表示数组的非优化方式,正如一位 V8 作者上次在 Google I/O 上向我解释的那样年。部分原因可能是浏览器优化了更常见的循环类型,而没有优化这种不太常见的方法。

无论哪种方式,更传统的循环在现代浏览器中变得更快:

http://jsperf.com/mikes-loops/2

但这与您的循环不同。在您的应用程序中,疯狂的性能提升直接归因于它根本 不运行循环这一事实。 :-)

关于javascript - 谁能解释一下这个循环是如何达到如此高的基准的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15858456/

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