在我寻求优化我的游戏引擎的过程中,我发现我所做的优化对每个浏览器的影响不同,在很多情况下,一个浏览器变得更糟而另一个浏览器变得更好!
目前,我正在尝试优化循环,因为我做了很多事情,并且取决于完成此操作的方式会对我的引擎性能产生很大影响。
基于此处的结果 http://jsperf.com/for-vs-while-loop-iterating/3
在 chrome 中似乎反向循环是最快的
var l = foo.length;
for (var i = l; i--;) {
}
在 firefox 中,for 循环是最快的
var l = foo.length;
for (var i = 0; i < l; 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);
}
}
}
但是这里似乎有很多开销可能会影响性能。
如果您要为不同的浏览器提供不同的循环方式,您会怎么做?
编辑:我的测试中似乎有一个错误,我在前向循环中做了太多循环,现在 chrome 似乎也是最快的,我可能不需要优化循环,但它可能仍然值得而正如另一条评论中提到的,以防浏览器版本再次改变性能
最佳答案
不幸的是,如果您的目标是在每个浏览器上实现最佳性能循环,那么您最不想做的事情就是在其中引入函数调用。您无法定义 foreach
函数,使其与直接的 for
循环一样快。调用迭代函数将消除您可能获得的任何 yield 。
快速的 jsperf 可以很容易地确认这一点。例如,运行 this one在 Chrome 或最新版本的 Firefox 或 Opera 上。它将向前循环与 for
、向后循环与 for
或使用浏览器的内置 Array#forEach
进行比较。函数(ECMAScript5 的一部分)。 (我认为我们可以假设您构建的任何 foreach
函数都会比内置函数慢。)如您所见,forEach
版本显着 比任何一个 for
循环都慢,这是有道理的:调用函数不是很昂贵,但也不是免费的。
请注意,您在 循环中所做的事情可能会消除递增计数和递减计数之间的差异。我要做的是弄清楚在较慢的浏览器上什么是最快的,然后使用它。例如,您说 Chrome 中的反向循环更快,而 Firefox 中的正向循环更快。由于 Chrome 的 V8 比 Firefox 的 SpiderMonkey 快得多(目前,这些东西一直在变化),所以选择前向循环,因为它在较慢的引擎上速度更快。
否则,您需要对代码进行预处理并针对每个浏览器制作不同的版本。
关于Javascript 优化 : Looping and handling different ways in different browsers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7057244/