如何加快排序的文件列表?

时间:2013-05-10 22:05:34

标签: php performance sorting iterator

我有一个 FileSystemIterator ,我需要对其进行排序。

我在iterator_to_array(new FileSystemIterator($dir, FilesystemIterator::SKIP_DOTS))上使用 uaSort 功能,具有以下排序功能:

function nameSort($a, $b) {
    if($a->isDir() === $b->isDir()){
        return strNatCaseCmp($a->getFilename(), $b->getFilename());
    }
    return $a->isDir() ? -1 : 1;
}

我在 $ dir 中有1063个文件和目录, nameSort 被调用11369次,生成的文件列表平均时间约为6秒。我想进一步测试项目是否是目录 uaSort 更多次调用 nameSort 但是这个假设是错误的,因为当我删除 isDir 号的行时通话时间增加到11957.然而,运行时间下降到0.6秒。

看起来调用 isDir 非常慢(它使列表慢10倍)。我怎样才能加快速度呢?

2 个答案:

答案 0 :(得分:2)

如果调用isDir的成本太高,并且每个路径调用它多次,则可能需要缓存某个目录是否为dir,并首先从缓存中检索它。这可以安全地调用isDir方法。

答案 1 :(得分:1)

如果您只想获取单个目录的内容,可以使用glob。

 $file = glob($path."/*", GLOB_MARK);
应该已经对

进行了排序,并且可以通过拖尾来识别目录/所以你可以将array_filter指出来