php 配列の全ての値を表示する場合「foreach」と「for」でパフォーマンスの計測する

php 配列の全ての値を表示する場合「foreach」と「for」でパフォーマンスの計測する

phpで、配列の全ての値を表示する場合「foreach」と「for」でパフォーマンスの計測するサンプルコードを記述してます。phpのバージョンは8.0です。

環境

  • OS  CentOS Linux release 8.0.1905 (Core)
  • php 8.0.0
  • nginx 1.14.1

実行時間計測

microtimeを使用すれば、処理にかかった時間を計測することが可能です。

$startTime = microtime(true);

// 処理を記述

$time = microtime(true) - $startTime; // 処理にかかった時間(ミリ秒)

以下は、配列の全ての値を表示する場合に、「foreach」と「for」を使用した場合のパフォーマンスの計測するサンプルコードとなります。

<?php

// 10万回実行
define('COUNT', 100000); 

$arr = ["aaa", "bbb", "ccc"];

// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i)
{
    foreach ($arr as $value) {}
}

result($startTime,'foreach');


// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i)
{
    for ($j = 0; $j < count($arr); ++$j) {}
}

result($startTime,'for');

function result($time,$str){
    
    echo '測定結果 : ' . $str . PHP_EOL;
    // 表示は少数第5桁まで
    echo "process time: " . number_format((microtime(true) - $time),5) . ' ミリ秒' . PHP_EOL;    
    echo PHP_EOL;
}

測定結果

[1回目] 
測定結果 : foreach
process time: 0.00889 ミリ秒

測定結果 : for
process time: 0.01932 ミリ秒

[2回目] 
測定結果 : foreach
process time: 0.00827 ミリ秒

測定結果 : for
process time: 0.01932 ミリ秒

[3回目] 
測定結果 : foreach
process time: 0.00823 ミリ秒

測定結果 : for
process time: 0.01855 ミリ秒

foreachの方がcountを使用しないので、パフォーマンスはいいです。

また、array_filterやarray_mapを使用した場合は、さらにパフォーマンスは悪くなります。

<?php

// 10万回実行
define('COUNT', 100000); 

$arr = ["aaa", "bbb", "ccc"];

// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i)
{
    array_filter($arr, fn($x) => $x);
}

result($startTime,'foreach');


// 計測開始
$startTime = microtime(true);

for ($i = 0; $i < COUNT; ++$i)
{
    array_map(fn($x) => $x, $arr);
}

result($startTime,'for');

function result($time,$str){
    
    echo '測定結果 : ' . $str . PHP_EOL;
    // 表示は少数第5桁まで
    echo "process time: " . number_format((microtime(true) - $time),5) . ' ミリ秒' . PHP_EOL;    
    echo PHP_EOL;
}

測定結果

測定結果 : array_filter
process time: 0.21176 ミリ秒

測定結果 : array_map
process time: 0.21040 ミリ秒