为什么Firefox运行此代码的速度比Chrome快10倍

时间:2016-09-26 11:22:36

标签: 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"

2 个答案:

答案 0 :(得分:4)

这个快速的脏代码在v8中已经明显加快了。 (1000x1000数据集~24ms)

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约为4ms,1000x1000约为11ms。请注意,我将循环反转,以便按顺序读取数据以利用预取,并且我还使用了更大的数据集来使改进显着。

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;
        }
    }
}

答案 1 :(得分:0)

我来自 2021 年。我目前在 i3 四核 CPU 64 位系统上使用适用于 Chrome 的 87.0.4280.88 版和适用于 Firefox 的 84.0.2 版。

我尝试了你的代码,结果是 Chrome 的:

enter image description here

这对于 FireFox 来说:

enter image description here

所以是的,截至目前,速度结果非常相似。但作为奖励,我做了一些测试代码:

    console.time("speed test");
    for(let i = 0; i < 100000; i++) {
      console.log(i);
    }
    console.timeEnd("speed test");

结果非常令人惊讶。

铬:2527.755859375 ms

火狐:15687ms