使用SearchOption.AllDirectories时,DirectoryInfo.GetFiles会变慢

Ric*_*ett 9 .net performance file-io

我正在从.NET应用程序中搜索大量(~200,000)文件的中等数量(~500)的文件夹.

我希望使用DirectoryInfo.GetFiles,传入SearchOption.AllDirectories.然而,这种方法似乎比编写我自己的代码来迭代目录并且GetFiles只是传入一个searchPattern.

相关的MSDN信息:

  • GetFiles(String)
    从与给定searchPattern匹配的当前目录返回文件列表.
  • GetFiles(String, SearchOption)
    从与给定searchPattern匹配的当前目录返回文件列表,并使用值确定是否搜索子目录.

有人有类似的经历吗?

Ant*_*lev 13

这两个功能实际上因其性能而臭名昭着.原因是GetFiles遍历整个目录树并构造一个FileInfo对象数组,然后才将结果返回给调用者.所述阵列的构造涉及大量内存分配(我确信它们在List内部使用,但仍然),因为无法提前知道条目的数量.

如果你真的进入了性能,你可以P/Invoke到FindFirstFile/FindNextFile/FindClose,一次将它们抽象为一个IEnumerable<FileInfo>yield FileInfo一个.