どちらが速い関数?PHP版

はじめに。
時と場合によると思いますが、どちらが速いのかまとめていきます。
ミリ秒の差などどうでもいいかもですが、どっち使うか迷ったら速いほうがいいかなと。
PHP5の現在(2009年)のお話です。



■「aaa,bbb」を分割したい場合。
「explode()」vs「split()」

A.(速い)「explode()」>「split()」(遅い)

explodeはデリミタ(区切り文字)を使用して、splitは正規表現を使用して分割します。
「split」は正規表現エンジンを使うオーバーヘッド分遅くなります。
正規表現の力が必要なく、単純に区切り文字で分割する場合は「explode」を使いましょう。
また Perl 互換の正規表現構文を使用する preg_split() は、往々にして split() よりも速い代替案となるようです。



■文字列「aaa」が「wwwaaaqff」に存在するか調べたい場合
「strstr()」vs「strpos()」vs「preg_match()」

A.(速い)「strpos()」>「strstr()」>「preg_match()」(遅い)

strpos()は文字列の中で最初に現れた位置を数字で返し、
strstr()は文字列の中で最初に現れる場所から文字列の終わりまでを返します。
preg_match()は正規表現を使っているので、正規表現エンジンを使うオーバーヘッド分遅くなります。
つまり、あるかないかの判定であればstrpos()のほうが、速くメモリ消費も少ないです。

・大文字小文字を判別しないstripos()などは、pregmach()よりも遅くなるようです。
・strposを使って存在しないか調べたい場合は「!== false」を使います。「== 0」にすると、先頭にあった場合期待通りに動作しません。


検証してるサイトがありました
http://labs.unoh.net/2007/05/phptips.html
http://634.ayumu-baby.com/pukiwiki/index.php?PHP%2FPHP%BA%C7%C2%AE%C5%C1%C0%E2#bc399dbe

* staticが使えるなら、staticを使う。速度は4倍になる。
* __get, __set, __autoload は避ける。
* require_once() はコストがかかる。
* include や require では絶対パスで指定する。
* スクリプトの開始時間は $_SERVER[’REQUEST_TIME’] で得る。
* 正規表現は、文字列関数で代用できないか探る。(文字を見つけるだけならstrposなどでもよい)
* str_replace は preg_replace より早いが、strtr は str_replace の4倍早い。
* 文字列/配列両方を受け入れる柔軟さを持つ関数は避ける。変わりに個別の関数を用意する。
* @によるエラー制御は遅い
* $row[’id’] は $row[id] より7倍早い
* エラーメッセージはコストがかかる
* for ($x=0; $x < count($array); $x) の count() のようにループの度に呼ばれる関数はさけ、変数に格納する。