2012-06-20 58 views
1

任何人都可以提出一種方法來刮這個腳本的任何時間?優化這個腳本

var countObject = new Object(); 
var length = data.length; 
for(var i = 0; i < length; i += 4) { 
    var key = data[i] + ',' + data[i+1] + ',' + data[i+2]; 
    if(typeof(countObject[key]) == 'number') { 
    countObject[key]++ 
    } else { 
    countObject[key] = 0 
    } 
} 

它是建立從畫布檢索到的數據中發現的RGB值出現次數。據推測,來自context.getImageData()的數據已經是一個優化的數組類型...?

編輯:我不需要在格式「255,255,255」的RGB值必然,它只是我可以想出用作數組鍵。一種不同的方法也是受歡迎的:-D

+0

僅供參考,你正在建造的東西叫做直方圖。 –

+0

當'countObject [key]'不是一個數字? – Blender

+0

也許你可以擺脫l =長度,只是使用長度,也許把++放在countObject的前面,也許一些簡短的if .. – Huangism

回答

2

我不知道這是否會產生任何顯着差異(你必須有一個的值看到任何明顯的性能差異),但你可以:

  • 創建使用快速比特移位操作,而不是緩慢的字符串連接鍵
  • 切出在分配的幾個步驟:

所以:

for(var i = 0, l = length; i < l; i += 4) { 
    var key = (data[i] << 16) + (data[i+1] << 8) + data[i]; 
    countObject[key] = (countObject[key] || 0) + 1; 
} 

編輯:既然你提到從鑰匙獲得的RGB值回來,這裏是它是如何做:

/** 
* From a color key (integer) return an object 
* with keys 'r', 'g' and 'b' 
*/ 
var colorFromKey = function(key) { 
    return { 
     'r': (key >> 16) & 0xFF, 
     'g': (key >> 8) & 0xFF, 
     'b': key & 0xFF 
    }; 
} 
+0

只要小心的變化。每種顏色都是8位,所以正確的應該是'data [i] << 16 + data [i + 1] << 8 + data [i + 2]' – linepogl

+0

@linepogl當然,謝謝,現在糾正它:) – Hamish

+1

他希望'countObject [key]'初始化爲0(如果它尚不存在),但是這會將其初始化爲1,除非將賦值部分更改爲'(countObject [key] || -1)'..但是由於0證明是錯誤的,所以這裏仍然存在問題。應該是'typeof countObject [key]!=='undefined'? countObject [key]:0;' – mVChr

1

任何人都可以提出一個方法刮鬍子隨時關閉此腳本?

沒有,似乎罰款,但我有一些其他的建議:

var countObject = new Object(); // use {} instead, that's more common 
var length = data.length; // why that? You are already using var l=... 
for(var i = 0, l = length; i < l; i += 4) { 
    var key = data[i] + ',' + data[i+1] + ',' + data[i+2]; 
    if(typeof(countObject[key]) == 'number') { // remove the brackets. typeof is no function 
    countObject[key]++ // ; missing 
    } else { 
    countObject[key] = 0 // are you sure this should not start with 1? 
    } 
} 

如果你有一個豐富多彩的圖像,它可能會更快之前(設置所有可能的密鑰,以做countObject的初始化0)。然後你保存每次迭代的if條件。

+0

謝謝你。我其實在前面的文件中有{},我剛剛在腳本中弄亂了:-) 重新讀取長度,我以前只能讀取一次數組的長度(每次讀入的語句都是?)。但我不必要地重新分配 - 我會糾正這一點。 我會看看初始化的countObject,但出現這種情況的圖像上傳後同步,所以我想這最終會增加總時間 – joevallender