0

我有一个需要排序的FileSystemIterator 。

我使用uaSort函数iterator_to_array(new FileSystemIterator($dir, FilesystemIterator::SKIP_DOTS))和以下排序函数:

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 倍)。我怎样才能加快速度?

4

2 回答 2

2

如果调用isDir成本很高,并且您在每个路径中多次调用它,那么您可能希望缓存某个目录,然后首先从缓存中检索它。这可以保护对该方法的大量调用isDir

于 2013-05-10T22:09:18.217 回答
1

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

 $file = glob($path."/*", GLOB_MARK);

应该已经排序并且目录可以通过tailing /来识别,所以你可以array_filter那些出来

于 2013-05-10T22:11:43.223 回答