c# - 减少从大量目录收集文件所需的时间

标签 c# .net performance winforms

嗨。

我不确定是否可以减少程序的加载时间,或者我是否只需切换到 SSD。但也许有人有一个想法:)

我从大量文件夹中获取前(最多)100 个文件,并将它们的路径写入单个列表。问题是加载此列表需要很长时间,因为我总是将文件夹的全部内容放入临时列表,然后将该临时列表的前 100 个条目写入我的最终列表。如果我可以跳过这个额外的步骤,也许会更快,但我不确定这是否可能,以及这是否会产生任何影响。

我的代码如下所示:

foreach (string Folder in FolderList)
{
    List<string> FileListTMP = new List<string>();
    FileListTMP.AddRange(Directory.GetFiles(Folder));
    int i = 0;
    while (i < FileListTMP.Count && i < 100)
    {
        FileList.Add(FileListTMP[i]);
        i++;
    }
}

如果能解决我的问题那就太好了,因为文件夹的数量总是在增长,而且加载时间已经大约 20 秒长。 :)

更多信息:目前大约有 1500 个文件夹。单个文件夹中的文件不超过 1000 个。每个文件夹平均约有 500 个文件。

最佳答案

您发布的代码直接相当于

FileList.AddRange(Directory.GetFiles(Folder).Take(100));

但是该代码段中唯一需要花费大量时间的是 GetFiles 调用。如果您正在处理数百万个项目,则在列表之间移动内容可能会出现问题,但在处理数百个项目时则不应该成为问题。但是您应该使用性能分析器来验证这个假设,也许有一些完全不同的东西需要时间。

您可以尝试将 .GetFiles 更改为 .EnumerateFiles,因为后者返回可枚举而不是数组,因此如果您不需要完整的列表,可能会更快所有文件。

根据我的经验,使用 native API 而不是 GetFiles 列出文件时也可能获得性能加速。类似this answer的东西。但它确实需要相当多的有点复杂的代码。

关于c# - 减少从大量目录收集文件所需的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76737747/

相关文章:

c# - 限制线程池中使用的处理器数量

c# - WPF : How do I make a editable path

c# - 使用 Entity Framework 4.1,如何使用不同的字段名称配置与复合键的一对多关系?

c# - 如何为具有特定属性的对象创建 Linq 扩展?

php - 具有大约 100 万个唯一关键字的表 utf_unicode 性能

c# - 将列表分解为一组索引列表

c# - 通过 C 库在 C# 应用程序之间共享数据

.net - 如何在 Linux 上通过 Ruby 使用我自己的 .Net 库?

Android HttpClient 性能

algorithm - 找到给定音调和 987654321 的除法余数