PHPで大きな配列などを扱うときはforeachでなくlistとeachを使うとメモリを節約できる という話があるんですが、これは2010年の話ですので、2014年に一般的に使われているPHPの場合、すべてのケースで foreach を使う方がよいです。

実際にメモリが節約できるかは簡単に計測できます。

実行結果は以下のような感じ。

消費メモリについても、実行速度についても foreach の方が優秀です。というわけで list-eachでループ作るのはやめて foreach 使っておきましょう。

カテゴリー:

2 thoughts on “while-list-eachでループ回すのやめよう

  1. とおりすがり より:

    PHP 5.4系だと、さらに顕著に差が出ました。
    rangeの数字を小さくしても傾向が変わらなかった為、キャッシュメモリ等の影響ではないと思われます。
    $keyがほしい時も含めて、foreachのほうが優秀だといえそうです。

    foreach ($items as $item)
    5.4.31
    1 => 0.1716 sec (40.75M / 65.75M)
    2 => 0.1560 sec (40.75M / 65.75M)
    3 => 0.1404 sec (40.75M / 65.75M)
    4 => 0.1464 sec (40.75M / 65.75M)
    5 => 0.1248 sec (40.75M / 65.75M)
    total => 0.7392 sec (40.75M / 65.75M)

    foreach ($items as $key=>$item)
    5.4.31
    1 => 0.1560 sec (40.75M / 65.75M)
    2 => 0.1560 sec (40.75M / 65.75M)
    3 => 0.1404 sec (40.75M / 65.75M)
    4 => 0.1716 sec (40.75M / 65.75M)
    5 => 0.1404 sec (40.75M / 65.75M)
    total => 0.7644 sec (40.75M / 65.75M)

    while (list($key, $item) = each($items))
    5.4.31
    1 => 4.5848 sec (41.00M / 65.75M)
    2 => 4.4736 sec (41.25M / 65.75M)
    3 => 4.4922 sec (41.50M / 65.75M)
    4 => 4.5374 sec (41.75M / 65.75M)
    5 => 4.5048 sec (41.75M / 65.75M)
    total => 22.5928 sec (41.75M / 65.75M)

    %01.4f sec (%01.2fM / %01.2fM)”.PHP_EOL,
    $s,
    $time,
    memory_get_usage(true)/1024.0/1024,
    memory_get_peak_usage(true)/1024.0/1024);
    }

    function f_loop1(array $items)
    {
    foreach ($items as $item) {
    }
    }
    function f_loop2(array $items)
    {
    foreach ($items as $key=>$item) {
    }
    }
    function w_loop(array $items)
    {
    while (list($key, $item) = each($items)) {
    }
    }
    echo PHP_VERSION . PHP_EOL;
    $items = range(0, 500000);

    $t = 0.0;
    for($i=1;$i<=5;$i++){
    $starttime = microtime(true);
    //f_loop1($items);
    //f_loop2($items);
    w_loop($items);
    $time = microtime(true) – $starttime;
    printmem($i,$time);
    $t += $time;
    }
    printmem("total",$t);

  2. halt より:

    とおりすがりさん調査ありがとうございます。
    やっぱり 2016年も「foreach 使いましょう」っていうのが結論なんですねー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ねこ認証:9つのパネルの中からねこを3匹選んでください