我使用 kmean 算法聚集了大约 40000 个点。在程序的第一个版本中,我这样写了欧几里得距离函数
var euclideanDistance = function( p1, p2 ) { // p1.length === p2.length == 3
var sum = 0;
for( var i in p1 ){
sum += Math.pow( p1[i] - p2[i], 2 );
}
return Math.sqrt( sum );
};
整个程序执行速度很慢,平均需要 7 秒。经过一些分析后,我像这样重写了上面的函数
var euclideanDistance = function( p1, p2 ) { // p1.length === p2.length == 3
var sum = 0;
for( var i = 0; i < p1.length; i++ ) {
sum += Math.pow( p1[i] - p2[i], 2 );
}
return Math.sqrt( sum );
};
现在这些程序平均需要大约 400 毫秒。这是一个巨大的时间差异,只是因为我编写 for 循环的方式。我通常不对for..in
数组使用循环,但出于某种原因,我在编写此函数时使用了它。
有人能解释一下为什么这两种风格在性能上有这么大的差异吗?