2020/11/09
今回はPHPのちょっとしたお話です。
PHPのforeachには2種類の構文があり、書き方によって要素のキーも参照することができます。
https://www.php.net/manual/ja/control-structures.foreach.php
で、昔「foreachのキーは使わないなら省略したほうが早いよ!」と聞いたので、どのくらい差があるか実際に調べてみました。
先に結論を書くと、ほとんど変わらないが省略したほうが早いな結果になりました!
検証環境
OS | MacOS Catalina (10.15.2) |
CPU | 3.1 GHz デュアルコアIntel Core i7 |
メモリ | 8GB |
PHP | 7.3.10 |
検証内容
キーなし
単純なインデックス配列を作成し、1000万回ループして時間を測定するPHPファイルを作成。
余計な処理は極力避けたいのでforeachの中身は空っぽです。
<?php ini_set('memory_limit', -1); $azarashies = []; for ($i = 0; $i <= 10000000; $i++) { $azarashies[] = "ゴマフアザラシ{$i}"; } // 計測開始 $time_start = microtime(true); foreach ($azarashies as $azarashi) { } // 計測終了 $time = microtime(true) - $time_start; echo $time . PHP_EOL; exit(0);
これをコマンドラインから何回か実行してみます。
【実行結果】
0.15403509140015 0.15202903747559 0.1510488986969 0.15087985992432 0.15509510040283
だいたい0.15秒ほどでした。
キーあり
次のキーあり版です。先ほどのコードのforeach部分にキーを足してみます。
<?php ini_set('memory_limit', -1); $azarashies = []; for ($i = 0; $i <= 10000000; $i++) { $azarashies[] = "ゴマフアザラシ{$i}"; } // 計測開始 $time_start = microtime(true); foreach ($azarashies as $key => $azarashi) { } // 計測終了 $time = microtime(true) - $time_start; echo $time . PHP_EOL; exit(0);
【実行結果】
0.20637083053589 0.20763683319092 0.20770597457886 0.2027440071106 0.2069890499115
こちらはだいたい0.2秒ほどでした。キーなしと比べて0.05秒ほど遅いです。
1000万回ループさせてこの差なので、実際に使うときはほとんど変わらないと思いますが、確実に早くはなるようです。
連想配列だとどうなるか
先ほどはインデックス配列で検証しましたが、連想配列の場合はどうなるかも試してみました。
ということでfor文で$azarashies
を作る部分だけ修正。
for ($i = 0; $i <= 10000000; $i++) { $azarashies["azarashi{$i}"] = "ゴマフアザラシ{$i}"; }
【キーなし】
0.14395403862 0.14292621612549 0.14186406135559 0.14439606666565 0.1437201499939
【キーあり】
0.22829008102417 0.22994494438171 0.22745299339294 0.23232412338257 0.22727990150452
キーなしのほうはちょっと早くなって、キーありのほうは少し遅くなりました。
といっても0.01秒前後なのでほぼほぼ誤差の範囲ですね。
あとがき
確かにキーを省略したほうがちょっとだけ早くなることが分かりました。
PHP愛好家たるもの、こういう細かい部分も検証しておくと博識っぽくて良いです。