javascript - 为什么 Firefox 运行这段代码的速度比 Chrome 快 10 倍

标签 javascript v8 spidermonkey

我需要在 WebKit 上运行这段代码,它是 android 混合应用程序的一部分:

for(var x = 0; x < width; x++) {
    for(var y = 0; y < height; y++) {
        var i = (y * width + x) * 3;
        var r = data[i];
        var g = data[i + 1];
        var b = data[i + 2];
        var green = is_green(r, g, b);
        x_histogram[x] += green;
        y_histogram[y] += green;
    }
}

这是要测试的完整代码:https://jsbin.com/boduputebu/edit?js,console

我认为 V8 比 Firefox (SpiderMonkey) 快,但对于这个简单的代码,SpiderMonkey 明显更快。在我的笔记本电脑上,性能是:

Chrome: 30 ms
Node: 30 ms
Firefox: 3 ms
Java (same code with Java): 3 ms

您是否有任何想法更改代码以使其在 V8 上运行更快。以目前的性能,我不得不在 Java 端编写它,但这对我来说不是一个好的选择。或者如果没有办法让它更快,你知道为什么 V8 运行这段代码很慢吗?

版本:

Chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"
FireFox: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0"

最佳答案

这个快速的 n 脏代码在 v8 中已经明显更快了。 (1000x1000 数据集约 24 毫秒)

var calc_histogram = function() {
    for(var x = 0; x < width|0; x++) {
        for(var y = 0; y < height|0; y++) {
            var  i = ((y * width + x) * 3)|0;
            var  r = data[i]|0;
            var  g = data[i + 1]|0;
            var  b = data[i + 2]|0;
            var  green = ((g > 80) && (g > (r + 35)|0) && (g > (b + 35)|0))|0;
            x_histogram[x] += green|0;
            y_histogram[y] += green|0;
        }
    }
};

|0 确保数字是一个整数,它是asm js技术。调用带有数字的数组需要确保它是一个整数,使用 |0 使其明确。

编辑: 这是我在没有不必要的 |0 的情况下设法获得的最快速度。 500x500 约为 4 毫秒,1000x1000 约为 11 毫秒。请注意,我反转了循环,以便它按顺序读取数据以利用预取,并且我还使用了更大的数据集来使改进变得明显。

var calc_histogram = function() {
    var i=0;
    for(var y = 0; y < height; y++) {
      for(var x = 0; x < width; x++) {
            var r = (data[i|0]+35)|0;
            var g = data[(i+1)|0];
            var b = (data[(i+2)|0]+35)|0;

            if((g > 80) && (g > r) && (g > b)){
              x_histogram[x]++;
              y_histogram[y]++;
            }
            i=(i+3)|0;
        }
    }
}

关于javascript - 为什么 Firefox 运行这段代码的速度比 Chrome 快 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39701516/

相关文章:

javascript - 对文档加载的 Ajax 调用不起作用

javascript - 如何使用实时数据库在 firebase 中处理多个选项卡

php - PHP 中 V8 的用例是什么?

node.js - 使用 perf_events 的 nodejs/v8 火焰图中的未知事件

javascript - 每次调用时都会重新创建 JavaScript 函数内部的数组吗?

javascript - 在SpiderMonkey中运行 'chrome'代码

javascript - 如何使用 Angularjs 和 PhoneGap 向 Web-Api 发送 GET 请求?

javascript - Jquery 表格排序器 : Select for external filter instead of input?

javascript - v8 是否能够根据 `const` 的值消除死代码?

javascript - 如何使用JavaScript在SPOJ上提交解决方案?