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