Javascript优化:在不同的浏览器中以不同的方式循环和处理

Javascript优化:在不同的浏览器中以不同的方式循环和处理,javascript,optimization,Javascript,Optimization,在我寻求优化我的游戏引擎的过程中,我发现我所做的优化对每个浏览器都有不同的影响,在很多情况下会使一个浏览器变得更差,而另一个浏览器变得更好 目前,我正在尝试优化循环,因为我做了很多,这取决于这样做的方式可以对我的引擎的性能有很大的影响 根据这里的结果 看起来chrome中的反循环是最快的 var l = foo.length; for (var i = l; i--;) { } 在firefox中,forward for循环是最快的 var l = foo.length; for (var

在我寻求优化我的游戏引擎的过程中,我发现我所做的优化对每个浏览器都有不同的影响,在很多情况下会使一个浏览器变得更差,而另一个浏览器变得更好

目前,我正在尝试优化循环,因为我做了很多,这取决于这样做的方式可以对我的引擎的性能有很大的影响

根据这里的结果

看起来chrome中的反循环是最快的

var l = foo.length;
for (var i = l; i--;) {

}
在firefox中,forward for循环是最快的

var l = foo.length;
for (var i = 0; i < l; i++) {

}
var l=foo.length;
对于(变量i=0;i
现在为了在每个浏览器中使用正确的一个,我正在做类似的事情

function foreach(func, iterations){
    var browser = $.browser;

    var i;

    if (browser.webkit)
    {
        for(i=iterations;i--;)
        {
            func(i);
        }
    }
    else
    {
        for (i = 0; i < iterations; i++)
        {
            func(i);
        }
    }
}
函数foreach(func,迭代){
var-browser=$.browser;
var i;
if(browser.webkit)
{
对于(i=迭代;i--;)
{
func(i);
}
}
其他的
{
对于(i=0;i
但这里似乎有很多开销可能会影响性能

如果你要为不同的浏览器提供不同的循环方式,你会怎么做


编辑:似乎在我的测试中有一个bug,我在前向循环中做了太多的循环,现在chrome似乎也是最快的,我可能不需要优化循环,但正如在另一篇评论中提到的那样,如果浏览器版本再次改变性能,可能仍然值得一试

您可以让
foreach
返回一个函数,这将是一个迭代器。因此,一旦在脚本中,
var iterator=foreach($.browser.webkit)。从那时起,您只需使用
迭代器(迭代,回调)
,它将不再执行任何条件


基本上,关键是用户的浏览器不会更改,因此每个脚本只需对该条件的执行结果求值一次。

您可以使
foreach
返回一个函数,该函数将是一个迭代器。因此,一旦在脚本中,
var iterator=foreach($.browser.webkit)。从那时起,您只需使用
迭代器(迭代,回调)
,它将不再执行任何条件


基本上,关键是用户的浏览器不会改变,因此每个脚本只需对该条件的执行结果进行一次评估。

我认为您的悬垂没有您感觉的那么大,但您可以做的是只进行一次测试:

var foreach;
if (forwardIsFaster) {
    foreach = function (func, iterations) {
        // loop forwards...
    };
} else {
    foreach = function (func, iterations) {
        // loop backwards...
    };
}

也就是说,我不确定使用浏览器嗅探是最好的解决方案;也许在启动时做一个测试循环,测量哪个解决方案更快,然后选择一个更快的解决方案。

我不认为您的开销像您感觉的那么大,但您可以做的是只做一次测试:

var foreach;
if (forwardIsFaster) {
    foreach = function (func, iterations) {
        // loop forwards...
    };
} else {
    foreach = function (func, iterations) {
        // loop backwards...
    };
}

也就是说,我不确定使用浏览器嗅探是最好的解决方案;也许在启动时做一个测试循环,测量哪个解决方案更快,然后选择一个更快的解决方案。

不幸的是,如果你的目标是在每个浏览器上实现最佳性能循环,那么你最不想做的事就是在其中引入函数调用。您无法定义
foreach
函数,使其与直接
for
循环一样快。调用迭代函数将消除您可能获得的任何收益

快速的jsperf可以很容易地确认这一点。例如,在Chrome或最新版本的Firefox或Opera上运行。对于
,它将前向循环与
进行比较;对于
,将后向循环与
进行比较;或者使用浏览器的内置功能(ECMAScript 5的一部分)。(我认为我们可以假设您构建的任何
foreach
函数都比内置函数慢。)正如您所看到的,
foreach
版本明显比
for
循环慢,这很有道理:调用函数并不昂贵,但不是免费的

请注意,您在中所做的循环可能会消除向上计数和向下计数之间的差异。我要做的是找出在较慢的浏览器上什么是最快的,并使用它。例如,你说过,在Chrome中反向循环更快,而在Firefox中正向循环更快。由于Chrome的V8比Firefox的SpiderMonkey快得多(目前,这些东西一直在变化),所以选择向前循环,因为它在较慢的引擎上更快


否则,您就需要对代码进行预处理,并为每个浏览器定制不同的版本。

不幸的是,如果您的目标是在每个浏览器上实现最佳性能循环,那么您最不想做的就是在其中引入函数调用。您无法定义
foreach
函数,使其与直接
for
循环一样快。调用迭代函数将消除您可能获得的任何收益

快速的jsperf可以很容易地确认这一点。例如,在Chrome或最新版本的Firefox或Opera上运行。对于
,它将前向循环与
进行比较;对于
,将后向循环与
进行比较;或者使用浏览器的内置功能(ECMAScript 5的一部分)。(我认为我们可以假设您构建的任何
foreach
函数都比内置函数慢。)正如您所看到的,
foreach
版本明显比
for
循环慢,这很有道理:调用函数并不昂贵,但不是免费的

请注意,您在
中所做的循环可能会消除向上计数和向下计数之间的差异。我要做的是找出在较慢的浏览器上什么是最快的,并使用它。例如,你说过,在Chrome中反向循环更快,而在Firefox中正向循环更快。因为Chrome的V8引擎速度比