PHP

ファイル検索する際はopendirが早い

More than 1 year has passed since last update.

globなんか遅いなあ、と思って他のファイル検索方法を調べてみました。

  • glob
  • opendir/readdir
  • DirectoryIndex

の3通りについて、実際に計測をしてみます。

test.php
<?php
function list_dir_by_opendir($dir)
{
    $ret[] = $dir;

    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            $file = $dir . DIRECTORY_SEPARATOR . $file;
            $ret[] = $file;
        }
        closedir($dh);
    }

    return $ret;
}

function list_dir_by_glob($dir)
{
    $ret[] = $dir;

    foreach( glob($dir.DIRECTORY_SEPARATOR.'{.*,*}',GLOB_BRACE) as $file ) {
        $ret[] = $file;
    }

    return $ret;
}

function list_dir_by_iterator($dir)
{
    $ret[] = $dir;

    foreach( new DirectoryIterator($dir) as $fileinfo ) {
        $ret[] = $fileinfo->getPathname();
    }

    return $ret;
}

$target_path = dirname(__FILE__);

$start1 = microtime(true);
for($i=0;$i<10000;$i++){
    $files1 = list_dir_by_opendir($target_path);
}
$elapse1 = round((microtime(true) - $start1) * 1000 / 10000,5);

$start2 = microtime(true);
for($i=0;$i<10000;$i++){
    $files2 = list_dir_by_glob($target_path);
}
$elapse2 = round((microtime(true) - $start2) * 1000 / 10000,5);

$start3 = microtime(true);
for($i=0;$i<10000;$i++){
    $files3 = list_dir_by_iterator($target_path);
}
$elapse3 = round((microtime(true) - $start3) * 1000 / 10000,5);

結果は、AMD1.5GHz/8GB/Win7の環境で

time1: 0.28807 msec
time2: 4.07651 msec
time3: 0.36839 msec

となり、opendir/readdirの圧勝となりました。
(DirectoryIteratorの計測方法が間違っていましたので訂正しました。こちらもかなり早いっぽいです)

以下、おまけとしてopendir/readdirを使ったファイル検索イテレータを作ってみました。
(2013.08.27 DirectoryIteratorの方が実測上高速でしたのでソースを削除しました。見てみたい方はご連絡ください)