Javascript 难以置信的快速JS循环?

Javascript 难以置信的快速JS循环?,javascript,performance,loops,for-loop,Javascript,Performance,Loops,For Loop,今天我有了一个检查循环性能的想法,我称之为“scoped for”。这个想法很简单。这个循环有两个变量,“i”和“l”,它们被定义为比循环本身“高一个范围”。 在这两个范围内没有其他东西 我已经创建了jsPerf并获得了惊人的结果。 我决定创建我的本地测试,结果甚至更好(1000x1000个循环的平均时间为“标准为”5s,“范围为”小于0.01s) 所以现在我想知道为什么这个循环这么快。我想这都是关于V8的,但你永远不知道 有人愿意解释吗 TLDR: 为什么这个循环这么快 var loop =

今天我有了一个检查循环性能的想法,我称之为“scoped for”。这个想法很简单。这个循环有两个变量,“i”和“l”,它们被定义为比循环本身“高一个范围”。 在这两个范围内没有其他东西

我已经创建了jsPerf并获得了惊人的结果。

我决定创建我的本地测试,结果甚至更好(1000x1000个循环的平均时间为“标准为”5s,“范围为”小于0.01s)

所以现在我想知道为什么这个循环这么快。我想这都是关于V8的,但你永远不知道

有人愿意解释吗

TLDR:

为什么这个循环这么快

var loop = ( function() {
                var i, l;

                return function( length, action ) {
                    for( i = 0, l = length ; i < l ; ++i ) {
                        action();
                    }
                };
            }() );
var循环=(函数(){
变量i,l;
返回函数(长度、动作){
对于(i=0,l=长度;i
不幸的是,这里没有魔法:您的测试有错误

对于
varinn
,正确调用
empty
函数
9999^2
次,而对于
varInScope
,只调用
9999
次。这就是它完成得更快的原因。您可以通过使
函数为空
来轻松测试这一点

原因是变量
i
l
varInScope
的外部和内部调用之间共享。因此,在内部循环完成后,
i
已经等于
l
,外部循环立即退出


请参阅每次初始化函数(在闭包中创建一组新变量)的固定版本,它确实比“正常”for循环慢20%

我猜引擎必须在前两种情况下在每个循环中创建变量I和l,在最后两种情况下,他在每个循环中都指向相同的i和l。我不知道这是否会有那么大的不同。javascript引擎是否会注意到您没有使用循环的结果并优化整个循环?似乎您已经外包了对理解问题至关重要的数据。请在问题本身中发布所有相关代码、图像和资源,如果链接消失或更改,您的问题将失去大部分(如果不是全部)含义@Philipp对于前两种情况(for中的var和fun中的var),性能确实很差,也许问题更多的是,为什么循环使用闭包比“标准”闭包快得多?@Philipp基本上我想看看每种方法之间的性能差异,即使是那些不好的方法。这就是问题的关键所在——为什么“范围”循环比“标准”循环快得多。我认为这都是关于在每个循环上创建新的“I”和“l”变量。也许GC也在做一些工作。谢谢你指出这一点!老实说,我很惭愧错过了这样一件事。。。无论如何,“神秘”已经被揭开:)