在.NET中,是否有一种使用静态方法获取文件大小的方法?

43

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

using System.IO;
class SizeGetter
{
  public static long GetFileSize(string filename)
  {
    FileInfo fi = new FileInfo(filename);
    return fi.Length;
  }
}
有没有一种方法可以在不创建FileInfo实例的情况下使用静态方法来完成相同的事情?
也许我试图过分地节约每次想要文件大小时创建一个新实例,但是以计算包含5000多个文件的目录的总大小为例。尽管GC被优化得多么好,应该有一种方法可以在不必要地增加税负的情况下完成这项工作吧?

2
你确定这是你的应用程序的瓶颈吗?我猜不是,那为什么要费心呢。 - Andrey
9
@Andrey 这并不是瓶颈的问题,而是语言和垃圾回收器有效使用的问题。这些事情总是值得质疑的,特别是如果你不熟悉GC的微妙之处。这不是我第一次被指责过度优化了,但我宁愿在关注这些方面上过于担心,也不想不去理会。此外,询问一个问题只需要几分钟。 - Will
3个回答

20

不用担心。首先,在.NET中进行分配是很便宜的。其次,该对象将在一代0中,因此应该可以在没有太多开销的情况下被回收。


2
我已经明白了,但作为一个老的C++程序员,一些有关优化/效率的旧习惯难以改掉。 - Will
6
我感觉FileInfo的内部操作会比对象本身的分配和垃圾回收带来更多的开销。同时还有一个正确的经验法则,即先节省时间。如果它不是瓶颈,就不要费心。通常情况下,小的优化并不值得你雇主支付给你的钱(至少在雇主眼中)。所以我的建议是:把它视为一种坏习惯,不要费心。;) - Dmitry

17

别担心。

  • 我找到了一篇博客文章,介绍了在.NET中创建对象的开销(C# Object Creation Time Trials)。实际上,创建10,000个对象需要0.03秒,即每个对象需要3微秒。从文件系统中读取文件长度所需的时间肯定会显著超过这3微秒。

  • .NET框架中有很多静态方法内部会创建对象并调用它们的实例方法(你可以通过查看参考源代码或使用一些反射工具来验证这一点)。你可能认为静态方法更快。不要做出这样的假设。如果你有两种方式去完成同一件事情,那就测量哪一种更快。


+1 个博客链接,好文章,非常准确,因为我是从 C++ 转换到 C# 的 :) 在涉及 GC 方面仍需要一些适应,如果它真的那么高效,那么你是对的,我的担忧是没有必要的。谢谢。 - Will
3
分配很便宜,但清理可能不是。 - Peter Mortensen
在C#中分配内存是非常便宜的,几乎可以忽略不计。但清理内存却非常昂贵。清理一个对象的内存分配,大约相当于复制一个相当大小的结构体1000次。因此,博客文章中的测量结果是无关紧要的,因为它没有测量真正的成本。 - Yair Halberstadt

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接