【问题标题】:Is there a way to get the size of a file in .NET using a static method?有没有办法使用静态方法获取 .NET 中文件的大小?
【发布时间】:2011-11-26 21:00:17
【问题描述】:

我知道获取文件大小的正常方法是使用 FileInfo 实例:

using System.IO;
class SizeGetter
{
  public static long GetFileSize(string filename)
  {
    FileInfo fi = new FileInfo(filename);
    return fi.Length;
  }
}

有没有办法使用静态方法来做同样的事情而不必创建 FileInfo 的实例?

也许每次我想要一个文件大小时,我都会过于吝啬地创建一个新实例,但以尝试计算包含 5000 多个文件的目录的总大小为例。像 GC 一样优化,难道不应该有一种方法可以做到这一点而不必对其进行不必要的征税吗?

【问题讨论】:

  • 您确定这是您应用的瓶颈吗?我想不是那么为什么要打扰。
  • @Andrey 这与其说是瓶颈,不如说是有效使用语言和垃圾收集器的问题。这样的事情总是值得质疑的,特别是如果你不熟悉 GC 的细微差别。这不是我第一次被指责过度优化,但我宁愿错误地过度关注这些事情而不是不去打扰。此外,问一个问题只需几分钟。

标签: c# .net performance optimization filesize


【解决方案1】:

别担心。首先,.NET 中的分配很便宜。其次,该对象将在 gen 0 中,因此应该在没有太多开销的情况下收集它。

【讨论】:

  • 我已经想到了,但是作为一个老 C++ 家伙,一些关于优化/效率的旧习惯很难改掉。
  • @Will 我有一种感觉,FileInfo 的内部工作比对象本身的分配和 GC 增加了更多的开销。还有一个右手拇指规则——首先节省你的时间。如果它不是瓶颈,请不要打扰。通常,在您忙于优化时(至少在雇主看来),您的雇主付给您的钱通常不值钱。所以我的建议:认为这是一个坏习惯,不要打扰。 ;)
【解决方案2】:

别担心。

  • 我发现有人在 .NET (C# Object Creation Time Trials) 中测量了创建对象的开销的博客文章,事实证明,创建 10,000 个对象需要 0.03 秒,即每 3 µs目的。从文件系统读取文件长度所需的时间肯定会显着支配这 3 微秒。

  • .NET 框架中的许多静态方法在内部创建对象并在其上调用实例方法(您可以通过查看参考源或使用一些反射工具来验证这一点)。您假设静态方法更快。不要做这样的假设。如果你有两种方法可以做同样的事情,衡量哪一种更快。

【讨论】:

  • +1 用于博客链接;很好读,因为我是 C++ 到 C# 的转换 :) 它仍然需要一些时间来适应 GC 所关心的地方,如果它真的那么高效,那么你是对的,我的担心是没有根据的.谢谢
  • 分配很便宜,但清理可能不会。
  • C# 中的分配非常便宜,几乎是免费的。清理费用非常昂贵。清理一个对象分配,大约相当于复制一个合理大小的结构 1000 次。因此,博客文章中的衡量标准是无关紧要的,因为它没有衡量真正的成本。
【解决方案3】:

如果您真的非常需要静态方法,请使用本机 GetFileSizeGetFileSizeEx API。但请记住,这将需要来自 CreateFile API 的文件句柄。

还可以查看FileInfo类的源码:

http://referencesource.microsoft.com/#mscorlib/system/io/fileinfo.cs#4ee673c1a4ecad41

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 2013-04-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多