注目キーワード
  1. 技術
  2. 広告
  3. IDFA
  4. PHP
  5. WordPress

PHP5.3 vs PHP7.1 関数速度検証

今さらですが、php5系とphp7系で関数の速度検証をまとめましたので記載します。

php7とは

phpバージョンの最新バージョンです。phpでは、5系が10年近く使われてきましたが、php7はかなり大きな変更がされているメジャーバージョンになります。また、php7にバージョンアップするメリットとして、処理速度の向上が大きく改善されました。php7はphp5系に比べて、おおよそ2倍のパフォーマンス向上が期待できると発表されています。これは主に内部的なデータ構造の改善やメモリ管理手法、検索手法の向上などによるものだそうです。

さらに、型宣言(タイプヒンティング)と戻り値の型指定ができるようになりました。関数のパラメータの型を縛る、静的言語のようなタイプヒンティングが出来るようになりました。同時に、戻り値の型も縛ることも可能です。
さらに、null合体演算子が追加されました。nullチェックが楽に出来る書き方です。isset()を使って、三項演算子で書く必要は無くなり、簡潔に書けるようになりました。
その他にも、宇宙船演算子が加わったり、list()が[]で書けるようになったり、様々な変更が加わりました。


検証すること

「配列の値に特定の値があるかどうか」に絞って、検証を進めたいと思います。in_arrayをはじめ、この要件を満たせる処理で比較をしていきます。比較するphpのバージョンは、php5.3.8とphp7.1.15です。


比較した4つの関数

・1. in_array
・2. array_flip() + keyでisset()
・3. array_flip() + keyでarray_key_exist()
・4. array_search()


テスト条件

・テスト1:配列の要素数は20個 – 探している値が最初に見つかるケース
・テスト2:配列の要素数は20個 – 探している値が最後に見つかるケース
・テスト3:配列の要素数は10000個 – 探している値が最初に見つかるケース
・テスト4:配列の要素数は10000個 – 探している値が最後に見つかるケース

この4つのテストケースで4つの関数で速度検証を進めていきます。


検証結果

php5.3で実行した結果

上記の結果になりました。
テスト1の場合は、早い関数で、0.037秒前後の結果になりました。array_flip() + keyでisset() と array_flip() + keyでarray_key_exist() した場合は、他と比べてやや遅くなっています。
テスト2の場合は、テスト1とほとんど同様です。見つけるまでのループ数が多いので、その分、速度が遅くなっています。
テスト3の場合は、in_array()とarray_search()の場合は、ほとんど変わっていません。1番目の要素をヒットさせているので、配列の要素数が幾つであっても変わらない結果になりました。
テスト4の場合は、ループ数で時間は全体的にかかっているものの、速度自体は大きく関数間で優劣はない結果になりました。

php7.1で実行した結果

上記の結果になりました。
テスト1の場合は、早い関数で0.007秒になりました。array_flip() + keyでisset()以外は大差なく処理できているようです。
テスト2の場合は、php5とほとんど同じ結果になりました。array_flip() + keyでisset() と array_flip() + keyでarray_key_exist() の場合は、他と比べてやや遅くなっています。
テスト3の場合は、テスト2同様に、php5とほとんど同じ結果になりました。array_flip() + keyでisset() と array_flip() + keyでarray_key_exist() の場合は、他と比べてやや遅くなっています。
テスト4の場合は、ループ数で時間は全体的にかかっているものの、速度自体は大きく関数間で優劣はない結果になりました。

結果

どの関数でも、php5とphp7を比較すると、平均5倍以上は速くなる結果になりました。関数同士の優劣は変わらないようです。値を1回だけあるかないかを判断するような処理であれば、in_array()が効果的です。ただ、毎回新しい配列を扱う場合は、array_flip()を使っていると、ひどく遅くなってしまうケースがあります。1回の処理で同じ配列に対して何度も検索をかける場合は、array_flip()をしてからisset()で探したほうが高速です。