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
が、何らかの理由でこの関数を作成するときに使用しました。
これら 2 つのスタイルのパフォーマンスに大きな違いがある理由を誰か説明できますか?