作業ノート

様々なまとめ、雑感など

PHPのfor文で、配列の数を評価するときの違いによるベンチマークを取ってみた

きっかけは仕事でコードレビューをしていたときに、以下のようなfor文をみたこと。

for ($i = 0, $count = count($data); $i < $count; $i++) {
    // 何らかの処理
}

$countはfor文の条件判定でしか使用されていなかったので、そのときは変数を使わずに直接書けばいいのにと思った。

for ($i = 0; $i < count($data); $i++) {
    // 何らかの処理
}

一方でそれぞれのパフォーマンスが気になったので、模したコードで確認してみた。

確認環境のOSはCentOS 7.1。

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

phpは5.6.11。

$ php -v
PHP 5.6.11 (cli) (built: Jul 12 2015 20:13:00)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

ベンチマーク取得のコードは下記のエントリーのコードを使用した。

d.hatena.ne.jp

実際に書いたコード。

以下は実行結果の一つ。

$ php bench_count.php
1
$count          :     0.0000 sec   @ 0.0000 sec (336.00%)
count()         :     0.0000 sec   @ 0.0000 sec (100.00%)
1
$count          :     0.0000 sec   @ 0.0000 sec (100.00%)
count()         :     0.0000 sec   @ 0.0000 sec (123.53%)
10
$count          :     0.0000 sec   @ 0.0000 sec (100.00%)
count()         :     0.0000 sec   @ 0.0000 sec (160.17%)
100
$count          :     0.0003 sec   @ 0.0000 sec (100.00%)
count()         :     0.0004 sec   @ 0.0000 sec (165.26%)
1000
$count          :     0.0027 sec   @ 0.0000 sec (100.00%)
count()         :     0.0048 sec   @ 0.0000 sec (180.65%)
10000
$count          :     0.0277 sec   @ 0.0000 sec (100.00%)
count()         :     0.0454 sec   @ 0.0000 sec (163.59%)
100000
$count          :     0.2720 sec   @ 0.0000 sec (100.00%)
count()         :     0.4506 sec   @ 0.0000 sec (165.69%)
1000000
$count          :     2.7292 sec   @ 0.0000 sec (100.00%)
count()         :     4.5232 sec   @ 0.0000 sec (165.73%)

1回から1000000回まで、実行回数を変えてそれぞれのパフォーマンスを相対的に確認する。 1回実行のテストを2回行っているのは、その内容に関わらずどうしても最初に実行したテストが遅くなったため。

何回か確認したが関数を毎回評価する方が遅く、その差は大体1.2倍から2倍ほど。 変数に比べて関数の方が遅いのは予想していたものの、相対的に見てここまで差があると変数にしたいのもわかる。