为什么Firefox的运行这段代码10X除Chrome
问题描述:
快我需要运行WebKit的这段代码,这是一个混合的应用程序的Android游戏的一部分:为什么Firefox的运行这段代码10X除Chrome
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"
答
这种快速ñ肮脏的代码已经显著更快的V8引擎。 (〜24MS为1000×1000的数据集)
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为〜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;
}
}
}
虽然差异较小(8-9 vs 2.5-3毫秒),我可以[重现](https://jsbin.com/nexocopuka/1/edit?js,console)这个。有趣。 – Cerbrus
FF并不忙于像Chrome那样收集元数据? – Teemu
你想要一个关于JavaScript引擎内部的技术说明,或者只是修复你的代码? –