非常快的JS循环

Incredibly fast JS loop?

本文关键字:循环 JS 非常      更新时间:2023-09-26

今天我有一个想法来检查循环的性能,我称之为"scoped for"。这个想法很简单。这个循环有两个变量,"i"answers"l",它们的定义比循环本身"高一个作用域"。

我已经创建了jsPerf并获得了惊人的结果。http://jsperf.com/variable-scoped-loop/6

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

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

有人愿意解释一下吗?

TLDR:

为什么这个循环这么快?

var loop = ( function() {
                var i, l;
                return function( length, action ) {
                    for( i = 0, l = length ; i < l ; ++i ) {
                        action();
                    }
                };
            }() );

不幸的是,这里没有魔法:您的测试是错误的。

对于varInFor, empty函数被正确地称为9999^2次,而对于varInScope,它只被称为9999次。这就是为什么它完成得更快。您可以通过让empty函数打印一些东西来轻松地测试这一点。

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

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