2012-06-20 59 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