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 回答