PHPプロ!TIPS+

比較演算子のパフォーマンス

PHPでの比較を行う場合、大抵は「==」「!=」を使用すると思います。ただし、巨大なデータを処理する際のパフォーマンスが問題になる場合は、「===」「!==」を使用することをオススメします。今回は2種類の演算子でのパフォーマンスの違いを見てみます。

「===」と「==」の違いは型が同じかどうかをチェックするかどうかです。「===」では型のチェックを行うので「12 === '12'」はfalseとなります。同様に「12 !== '12'」はtrueとなります。

型のチェックを行うのだから、パフォーマンスは「===」の方が低くなると思うかもしれませんが、実際は高いのです。「==」では型の変換処理を内部で実行しようとするためで、型の変換をしないで比較を行う「===」の方が高速なのです。

まずは以下のスクリプトを見てください。

<?php
$MAX 
10000000;
$hoge "abcdefg";
for (
$i 0$i $MAX$i++) {
  if (
$hoge == "abcdefg")
}

これを test_default.php とします。「===」を使用したスクリプトをtest_strict.php とします。これをtimeコマンドを使用して調べます。また、基本部分の実行スピードを調べるために、以下のtest_base.phpも使用します。

<?php
$MAX 
10000000;
$hoge "abcdefg";
for (
$i 0$i $MAX$i++) {
//  if ($hoge == "abcdefg")
}

テストの結果は以下のようになりました。

$ time php test_default.php
real    0m4.785s
user    0m4.771s
sys     0m0.009s

$ time php test_strict.php
real    0m3.826s
user    0m3.817s
sys     0m0.006s

$ time php test_base.php
real    0m2.217s
user    0m2.210s
sys     0m0.006s

if文の判定にかかる時間は「==」の場合で2.5秒、「===」の場合で1.6秒となり、3割は早くなりました。

また、数値文字列同士の比較(「"12"=="12"」と「"12"==="12"」)では3.6秒と1.6秒と、差がかなり大きくなりました。数値文字列同士の比較では数値への変換が行われ、そこで速度の低下が起きてしまいます。

ただし、「===」を使う場合には注意する点もあります。たとえば、POSTやGETのデータは文字列となってしまうので、その値と数値を「===」で比較する場合は、POSTやGETの変数を数値にキャストする必要があります。

文字列同士の比較であれば、「===」の方が高速なので使うようにしましょう。ただし、数値比較に関しては、数値文字列が混入すると問題になるのであれば、「==」を使用した方が無難かもしれません。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)