ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【PHP】foreachのキーを省略するとどのくらい早くなるのか検証してみた件

time 2020/01/28

今回は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愛好家たるもの、こういう細かい部分も検証しておくと博識っぽくて良いです。

down

コメントする