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

4

2 に答える 2

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
   };
}
于 2012-06-20T20:53:38.017 に答える
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 条件を保存します。

于 2012-06-20T20:55:29.777 に答える