人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記スクリプトの関数distanceSquaredPointsの実行速度を上げる方法はあるでしょうか。
2つの1次元配列の距離を求める関数です。
入力される配列は、少なくても一つの要素が入っています。
(コメントに配列初期化用のスクリプトを書いておきます)

私のPCでは、
finished in 0.17376899719238sec.
でした。

ポイントの指摘のみでも歓迎ですが、可能なら、変更前のスクリプトの時間と変更後の時間を計測して答えに記述していただけると嬉しいです。

(インデントするために空白を全角スペースに変換しています)
<?php
function distanceSquaredPoints($lhs, $rhs) {
$result = 0;
foreach($lhs as $i => $lv){
$rv = 0;
if(isset($rhs[$i])){
$rv = $rhs[$i];
}
$result +=
($lv - $rv) *
($lv - $rv);
}
foreach($rhs as $i => $rv){
if(isset($lhs[$i]) && $rv == 0){
continue;
}
$lv = 0;
$result +=
($lv - $rv) *
($lv - $rv);
}
return $result;
}
?>


●質問者: kent013
●カテゴリ:コンピュータ
✍キーワード:1次元 as CONTINUE LV pc
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● kn1967
●100ポイント ベストアンサー
function distanceSquaredPoints($lhs, $rhs) {
 $result = 0;
 foreach($lhs as $i => $lv){
 if(isset($rhs[$i])){
 $result += ($lv - $rhs[$i]) ^ 2;
 } else {
 $result += $lv ^ 2;
 }
 }
 foreach($rhs as $i => $rv){
 if(!isset($lhs[$i])){
 $result += ($lv - $rv) ^ 2;
 }
 }
 return $result;
}

サーバ負荷をあまりかけられないので

600-1000 ではなく 60-100 という非常に小さな値で数回ではありますが

テストしたところ平均で 0.049 → 0.042 と差が出ましたのでお試しあれ。

◎質問者からの返答

kn1967さん、ありがとうございます。

こちらで、600-1000でテストしたところ

前 0.081698894500732sec

後 0.064887809753418sec

と速度が変わりました。

この関数はプロファイラで見てクリティカルなところでした。

少なくても66万回呼ばれますので、20%の速度アップはかなり嬉しいです!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ