提问人:Katai 提问时间:8/8/2015 最后编辑:p uKatai 更新时间:1/29/2019 访问量:351
使用数组时 Javascript 向后循环速度较慢?
Javascript backwards loop slower when working with arrays?
问:
我们中的许多人可能已经知道这一点:
var list = ...
var index = list.length
while( index-- ) {
// do something
}
据说这是在 javascript 中进行循环的最快方法,因为您可以避免额外的测试。到目前为止,在过去的几年里,我在处理速度很重要且顺序并不重要的数据时使用了这种技术。
但是现在我偶然发现了一篇文章,说这在处理数组时实际上更慢。
这使您避免了额外的测试(与标准相比 循环)。但你知道吗?这将比使用 正确的顺序。因为世界上所有的 CPU 缓存都期望处理 为了“直截了当”,您将一次又一次地出现缓存未命中,以及 2 倍 当你幸运的时候,放慢速度是你会得到的。
所以不要向后循环,除非你有很好的理由这样做。
来源:https://gamealchemist.wordpress.com/2013/05/01/lets-get-those-javascript-arrays-to-work-fast/
现在我很好奇!我只有有限的可能性来测试这些东西,我发现的每个其他地方仍然说向后循环是最快的方法(甚至在stackoverflow上有多个答案)。在处理(可能是大型)数组时,真的是这样吗?
在过早的优化答案出现之前(就像这种类型的问题经常做的那样):这主要只是好奇心,是的,在游戏之类的事情上,性能很重要!
关于 jsperf:到目前为止,jsperf 似乎暗示向后循环更快(我现在无法检查测试,因为它不会在任何 atm 上加载结果 - 所以我回想起我之前看到的内容)。这就是这个问题的来源:这两条信息是自相矛盾的——至少如果那篇文章中所说的是真的!那么,到底什么是“正确的”呢?
答:
该论点的推理是无效的。CPU 缓存在有序内存访问方面提供了好处,因为它们缓存了内存块,如果您按顺序浏览内存,那么您将连续几次命中同一个块,而不必每次都加载一个块。
但是,无论您是在这样的线性进程中前进还是后退,这与这是否适用没有区别。
可能有许多不同的因素在起作用,影响这些替代方案的相对性能(尤其是如果引擎试图优化特定的常见模式,这可能意味着那些看起来比竞争对手做更多工作的人实际上做得更少)。这些因素也可能因平台而异。
但是,期望向前访问击败向后访问的特殊原因并没有成功。
评论
for