gpt4 book ai didi

使用数组时 Javascript 向后循环变慢?

转载 作者:数据小太阳 更新时间:2023-10-29 05:38:15 26 4
gpt4 key购买 nike

我们中的许多人可能已经知道这一点:

var list = ...
var index = list.length

while( index-- ) {
// do something
}

这被认为是在 javascript 中执行循环的最快方法,因为您可以避免额外的测试。到目前为止,在过去的几年里,我在处理速度很重要而顺序并不重要的数据时使用了这种技术。

但现在我偶然发现一篇文章说处理数组时这实际上更慢

Which makes you avoid an extra test (compared to the standard for loop). But you know what ? this will be much slower than using the right order. Because all CPU caches in the world expect the processing to be ‘straight’, you will have cache misses again and again, and a 2X slow down is what you’ll get when you are lucky.

So do not loop backward unless you have very good reasons to do so.

来源:https://gamealchemist.wordpress.com/2013/05/01/lets-get-those-javascript-arrays-to-work-fast/

现在我很好奇!我只有有限的可能性来测试这些东西,而且我发现的每个其他地方仍然说向后循环是最快的方法(甚至在 stackoverflow 上有多个答案)。 在处理(可能很大的)数组时真的是这样吗?

在出现过早的优化答案之前(就像这类问题经常出现的那样):这主要只是出于好奇,是的,在游戏等方面,性能很重要!

关于 jsperf:到目前为止,jsperf 似乎暗示后向循环更快(我现在无法检查测试,因为它不会在任何 atm 上加载结果 - 所以我'记忆我之前看到的)。这就是这个问题的来源:这两条信息自相矛盾 - 至少如果那篇文章中所说的是真的!那么到底什么是“正确”?

最佳答案

该论证中的推理是无效的。 CPU 缓存为有序内存访问提供了好处,因为它们缓存了内存块,如果您按顺序访问内存,那么您将连续访问同一个 block 几次,而不必每次都加载一个 block 。

但是,无论您是在这种线性进程中前进还是后退,都不会影响这是否适用。

可能有很多不同的因素在影响这些替代方案的相对性能(尤其是如果引擎试图优化特定的常见模式,这可能意味着那些看起来比竞争对手做更多工作的人实际上做的更少).这些因素也可能因平台而异。

但是这种期望前向访问击败后向访问的特殊原因并没有成功。

关于使用数组时 Javascript 向后循环变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31891048/

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