我有一个包含子目录的目录,每个子目录都包含大量文件。每个这样的目录在其子目录中至少包含 100k 总文件,其中 ecah 子目录每个直接包含大约 150 个文件。我想显示目录中的文件总数,包括其所有子目录的文件计数。虽然我可以通过使用
System.IO
中的 .NET API 来完成此操作,但还有更好的方法吗?
仅使用 .NET 的标准库,最快的选择是
int count = Directory.EnumerateFiles(...).Count();
这比通过
foreach
循环获取文件本身要快,因为我们没有检索并构建正在迭代的文件信息对象。不过,这并不是故事的结局。
还有其他帖子询问如何快速列出目录和子目录,通过研究,我在 这个存储库(很快就会有 NuGet 包)中提出了更快的实现。
300k 文件分布在 300 个子目录中的示例:
方法 | 意思是 | 比率 | 已分配 | 分配比例 |
---|---|---|---|---|
获取文件计数 | 111.1 毫秒 | 0.95 | 99.25 KB | 0.004 |
目录_枚举文件 | 116.6 毫秒 | 1.00 | 25741.13 KB | 1.000 |
通过在调用 Windows API 时重用相同的结构,并且仅分配计算要迭代的子目录的路径所需的字符串,可以避免分配。
对于上面的例子,我们似乎已经遇到了 API/IO 瓶颈,因此可能几乎无法改进。不过,主要影响是分配减少,这对于更密集和更紧凑的目录来说是巨大的。