2016-09-26 41 views
7

快我需要運行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" 
+0

雖然差異較小(8-9 vs 2.5-3毫秒),我可以[重現](https://jsbin.com/nexocopuka/1/edit?js,console)這個。有趣。 – Cerbrus

+1

FF並不忙於像Chrome那樣收集元數據? – Teemu

+0

你想要一個關於JavaScript引擎內部的技術說明,或者只是修復你的代碼? –

回答

4

這種快速ñ骯髒的代碼已經顯著更快的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; 
     } 
    } 
} 
+0

您只需要使用'var green =((g> 80)&&(g>(r + 35)| 0)&&(g>(b + 35)| 0))| 0;'。 「| 0」的其餘部分是微不足道的。不錯,找到。 – Cerbrus

+0

@Cerbrus你做過基準測試了嗎?我先試了一下,然後我看到更多的改進與其他| 0。 – bokan

+0

是的,[我確實](https://jsbin.com/sowohefile/2/edit?js,console)。僅在該行中的「| 0」與在其他行上的差異非常微不足道。 – Cerbrus

相關問題