Directory.GetFiles()性能问题

时间:2015-05-12 01:55:37

标签: c# performance linq filesystems

使用System.IO.Directory.GetFiles(),我想在NAS服务器上找到图像.png扩展名。

string searchingString = "ZLLK9";
// original
var fileList1= Directory.GetFiles(directoryPath).Select(p => new FileInfo(p)).Where(q => q.Name.Substring(0, q.Name.LastIndexOf('.')).Split('_').First() == searchingString);
// fixed    
var fileList2 = Directory.GetFiles(directoryPath, string.Format("{0}_*.png", searchingString));

有两种方法可以找出包含“ZLLKK9”字样的文件。

使用LINQ的第一个“原始”方式太慢,无法找到文件。 性能问题已经出现,但我不知道“固定”方式有什么不同?

我需要帮助以两种方式仔细了解差异。

3 个答案:

答案 0 :(得分:4)

第一个是获取该目录中的所有文件对象,然后执行查询以查找名称。

第二个是仅使用Windows内部API返回名称文件,这比c#方法(LINQ)快得多。

性能的不同更多地利用了比C#代码更快的内部API。

答案 1 :(得分:3)

第一种方式很慢有两个原因:

  • 您正在为每个文件构建一个System.identityHashCode对象。如果你想要的只是文件名,就没有必要这样做。构造FileInfo相对较轻,但它是不必要的,如果您查询大量文件,所有实例化都会降低您的速度。因为你真正需要的只是文件的名称,所以你可以不用这个额外的步骤。

  • LINQ方法检索所有内容,然后过滤。让文件系统为您进行过滤效率更高(也更快)。

如果您仍然想使用LINQ,那么这是一个更高性能的查询版本,它会减少大量的枚举和字符串操作:

FileInfo

答案 2 :(得分:2)

答案取决于您使用var fileList1 = Directory.GetFiles(directoryPath).Where( path => Regex.IsMatch(Path.GetFileName(path), @"^ZLLK9_.*\.png$")); 的方式。

您的原始解决方案从目录中获取所有文件。然后,您的软件会遍历它们以找到正确的模式。这里的文档:Directory.GetFiles Method (String)

您的固定版本使用不同的.NET Framework方法Directory.GetFiles Method (String, String)。第二个参数是搜索模式。过滤文件不是由您自己编写的代码(LINQ),而是由底层操作系统本身。