[PHP-users 16971]Re: in_array()なぜだめ?

Yasuo Ohgaki yohgaki @ ohgaki.net
2003年 7月 26日 (土) 09:02:23 JST


大垣です。

kentarou_ishimaru wrote:
>  kehiといいます。
>>大垣です。
>>ISIGEさんが説明されている通りです。
>>
>>追加で説明すると、in_array()を利用した場合 O(n)の実行時間が
>>必要になり、PHPの配列がハッシュである特徴を利用した場合、
>>O(1)の実行時間が必要になります。
>>
>>小さいや単純なプログラム、同時ユーザ数の少ない忙しくない
>>Webサーバではこの違いは判りづらいかも知れませんが、条件に
>>よってはこの変更により数倍の性能が実現できる事もあります。
> 
> 
> とある、以前作ったシステムにてin_array()を使って
> 数万件の登録データのサニタイズをしている処理で試したところ、
> 配列で49秒かかっていた処理がハッシュで13秒に短縮しました。
> ホントに数倍の性能アップ、体感しました。
> とてもいい情報感謝です。
> 
> 他にもこういったTIPSってありますでしょうか?
> 
> たとえば1行で処理を書いた場合と複数行に渡って分けた場合と、
> どちらが効率的かなど。。。
> #前者と思ってますが、もしかしてコンパイルされてしまえば変わりませんか?
> 
> $hoge = substr(str_replace("$","",uniqid(crypt($hoge))),3,7);
>> $hoge = crypt($hoge);
> $hoge = uniqid($hoge);
> $hoge = str_replace("$","",$hoge);
> $hoge = substr($hoge,3,7);
> など。。。

1行で記述した場合の方が早いです。
ソースを可読性を向上するためにCやJavaと同様に一時的な
変数を多用すると性能面で非常に不利になる場合もあります。

# 基本的にPHPはスクリプト言語なのでコンパイル時に最適化
# は行われていません。ZendOptimizerはバイトコードレベル
# で最適化を行っているようですがオープンソースではない
# ので実際にはどうなっているか知りません。

ただし、極端に一時変数の利用を少なくすると可読性が著しく
低下するのでバランスを取る必要があります。

ループ回数が多い場合、ループ内では一時変数をできるだけ使
わないようにするだけで数十%の性能向上が可能な場合(それ以
上)もあります。

良くある性能面で不利な記述は単純な文字列検索や文字列の
抽出と比較で可能な場合に正規表現を使っている等、いろいろ
性能向上に役立つ記述方法は多くあります。

設定面ではCLIを使っている場合、ini_set('implicit_flush', 0)
にしないと無駄なIOフラッシュの為、性能が低下します。
試していませんが、特にWindowsでは性能劣化が大きいようです。
ベンチマークはしていませんが、全ての文字エンコーディング
(スクリプト、入出力)をUTF-8にすると、mbstringの仕様上最も
良い性能を期待できます。

特にお薦めする訳ではありませんが、つまらないところでは、

echo $foo,$bar;
echo $foo.$bar;

では"."(ピリオド)より","(カンマ)を使った方が速いです。
# これは","の場合、出力の前に文字列(変数)の連結が行われな
# い為です。

速いスクリプトを書くテクニックはいろいろあります。
ベンチマークして試してみるのが一番です。

--
Yasuo Ohgaki




PHP-users メーリングリストの案内