Javascript 优化 : Looping and handling different ways in different browsers

标签 javascript optimization

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

目前,我正在尝试优化循环,因为我做了很多事情,并且取决于完成此操作的方式会对我的引擎性能产生很大影响。

基于此处的结果 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/

相关文章:

algorithm - 对于掷硬币游戏来说,比暴力算法更好

c# - 按字段复制对象

javascript - 如何将对象数组绑定(bind)到 D3 饼图中的弧线?

javascript - 当我们键入多动态数组的静态内容并创建数组数组时有什么区别

javascript - 如何优化此 HTML 以在浏览器中更快地呈现?

algorithm - 缩短 14 位以上的大数字

c++ - 为什么基于 Dear ImGui 的渲染器这么慢?

javascript - CSS/JS - 禁用点击事件但允许在 DIV 上滚动

javascript - 动态 chop <option> 文本以适应 <select> 列表

javascript - 使用map es6的嵌套对象数组在jsx中不起作用