Kat*_*tai 6 javascript arrays performance loops while-loop
我们中的许多人可能已经知道这个:
var list = ...
var index = list.length
while( index-- ) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
据说这是在javascript中进行循环的最快方法,因为你避免了额外的测试.到目前为止,在过去几年中,我在处理数据时使用了这种技术,其中速度很重要且顺序并不重要.
但是现在我偶然发现了一篇文章,说在处理数组时这实际上比较慢.
这使您避免额外的测试(与循环标准相比).但你知道吗?这比使用正确的订单慢得多.因为世界上所有的CPU缓存都希望处理"直接",所以你会一次又一次地出现缓存未命中,并且当你运气好时,你会得到2倍的缓慢.
因此,除非您有充分的理由这样做,否则不要向后循环.
来源:https://gamealchemist.wordpress.com/2013/05/01/lets-get-those-javascript-arrays-to-work-fast/
现在我很好奇!我只有有限的可能性来测试这些东西,而我发现的每个其他地方仍然说最后一个循环是最快的方式(甚至是stackoverflow上的多个答案).处理(可能很大)数组时,这是真的吗?
在过早优化答案弹出之前(就像它经常对这类问题一样):这主要是好奇心,是的,在游戏等方面,性能很重要!
关于jsperf:到目前为止,jsperf似乎暗示后向循环更快(我现在无法检查测试,因为它不会将结果加载到任何atm上 - 所以我回想起之前看到过的内容).这就是这个问题的根源:这两条信息本身就是矛盾的 - 至少如果那篇文章中所说的是真的!那到底什么是"正确的"呢?
该论证中的推理是无效的。CPU 缓存为有序内存访问提供了好处,因为它们缓存内存块,如果您按顺序访问内存,那么您将连续几次访问同一个块,而不必每次都加载一个块。
然而,无论你在这样的线性进程中前进还是后退,这对于这是否适用都没有影响。
可能有很多不同的因素在影响此类替代方案的相对性能(尤其是如果引擎试图优化特定的常见模式,这可能意味着那些看起来比竞争对手做更多工作的引擎实际上做得更少)。这些因素在不同平台上也可能存在很大差异。
但这种期望前向访问能够击败后向访问的特殊原因并不成立。