Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用数组时Javascript向后循环速度较慢?_Javascript_Arrays_Performance_Loops_While Loop - Fatal编程技术网

使用数组时Javascript向后循环速度较慢?

使用数组时Javascript向后循环速度较慢?,javascript,arrays,performance,loops,while-loop,Javascript,Arrays,Performance,Loops,While Loop,我们中的许多人可能已经知道这一点: var list = ... var index = list.length while( index-- ) { // do something } 这应该是在javascript中执行循环的最快方法,因为您可以避免额外的测试。到目前为止,在过去的几年中,我在处理速度很重要而顺序并不重要的数据时使用了这种技术 但是现在我偶然发现了一篇文章,上面说这实际上在处理数组时要慢一些 这使您避免了额外的测试(与 循环)。但是你知道吗?这将比使用 顺序正确。

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

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

while( index-- ) {
    // do something
}
这应该是在javascript中执行循环的最快方法,因为您可以避免额外的测试。到目前为止,在过去的几年中,我在处理速度很重要而顺序并不重要的数据时使用了这种技术

但是现在我偶然发现了一篇文章,上面说这实际上在处理数组时要慢一些

这使您避免了额外的测试(与 循环)。但是你知道吗?这将比使用 顺序正确。因为世界上所有的CPU缓存都需要处理 要做到“直截了当”,您将一次又一次地出现缓存未命中,并出现一个2X 当你运气好的时候,你会慢下来

因此,除非有很好的理由,否则不要反向循环

资料来源:

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

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


关于jsperf:到目前为止,jsperf似乎意味着反向循环更快(我现在无法检查测试,因为它不会在任何atm上加载结果,所以我回忆起以前看到的情况)。这就是这个问题的来源:这两条信息相互矛盾——至少如果那篇文章所说的是真的!那么到底什么是“正确的”呢?

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

然而,无论你是在这样一个线性过程中前进还是后退,这对你是否适用都没有区别

可能有许多不同的因素在影响这些替代方案的相对性能(尤其是如果发动机试图优化特定的通用模式,这可能意味着那些似乎比竞争对手做得更多的发动机实际上做得更少)。这些因素在不同平台之间也可能存在很大差异


但是,这种期望前向访问优于后向访问的特殊原因并没有实现。

为什么不在您关心的浏览器中用jsperf测试它(需要几分钟才能得到第一个结果)?所有性能问题都必须在您关心的环境中通过测试来回答。在没有对自己进行任何测试的情况下发布此问题似乎表明您只希望其他人为您进行测试。与缓存未命中相关的事实是真实的。CPU希望按顺序遍历数组。此外,由于JS引擎定期添加性能增强,完全有可能一些或许多浏览器为典型的数组迭代
for
循环添加了优化,以加快其速度。你几年前读到的东西,今天可能还不成立。@jfriend00是的,但这也是问题所在(也是这个问题的原因):jsperf似乎暗示反向循环更快(我在这几年中看到了一些测试)。所以jsperf实际上与此相矛盾——但可能也是这样,因为这些测试过于专注于一件事?我真的很想听听“因为世界上所有的CPU缓存都希望处理是“直接的”,你会有缓存未命中……”这一论点是否是基于现实的——因为如果是这样的话,从理论上讲,反向循环应该会慢一些,对吧?如果你在多个浏览器中都有当前的jsperf性能数据,那么就发布它。如果没有一些性能数据,这个问题真的毫无意义。在采取措施了解当前情况之前,没有任何有用的讨论。你不能通过对事物的理论化来判断哪件事情会更快。你测量。你可以尝试通过理论来解释一个度量,但不能反过来解释。它似乎是指在缓存未命中之前,哪个缓存块试图获取下一个缓存块。@Bergi在不尝试更奇特的东西时,我认为这是双向的。毕竟,用于堆栈的上下内存是一种特别常见的模式。是的,你需要一个非常愚蠢的预测器,我只是想说,这种推理并不是完全无效的。然而,我完全同意“可能有很多不同的因素在起作用……”