2011-09-28 32 views
31

我知道得到一個文件的大小的正常方式是使用一個FileInfo實例:有沒有辦法在.NET中使用靜態方法獲取文件的大小?

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

有沒有辦法做同樣的事情,而不必創建了FileInfo的一個實例,使用靜態方法?

也許我試圖過度吝嗇,每次我想要一個文件大小創建一個新的實例,但例如試圖計算包含5000多個文件的目錄的總大小。就像GC一樣優化,不應該有辦法做到這一點,而不必不必要地加稅嗎?

+2

你確定這是你的應用程序的瓶頸?我想不是那爲什麼要麻煩。 – Andrey

+6

@Andrey它不是瓶頸,因爲它是有效使用語言和垃圾收集器的問題。這樣的事情總是值得質疑,特別是如果你不熟悉GC的細微差別。這不會是我第一次被指責過度優化,但我寧願過分擔心這樣的事情,而不是不打擾。此外,只需幾分鐘就可以提出問題。 – Will

回答

14

別擔心。首先,.NET中的分配很便宜。其次,該對象將在第0代,因此應該收集而沒有太多的開銷。

+2

我曾經想過,但作爲一個老C++的人,一些關於優化/效率的舊習慣很難實現。 – Will

+4

@我感覺FileInfo的內部工作比對象本身的分配和GC增加了更多的開銷。還有一個正確的拇指規則 - 首先節省你的時間。如果不是瓶頸,不要打擾。在你忙於優化時(通常在僱主眼中),通常小規模的優化並不值得你的僱主支付給你。所以我的建議是:把它變成一個壞習慣,不要打擾。 ;) – Dmitry

15

別擔心。

  • 我發現誰測量的對象創建的.NET中的開銷(C# Object Creation Time Trials)某人的博客文章,而且,事實證明,創造10,000個對象了0.03秒,即每對象3微秒。從文件系統中讀取文件長度所需的時間肯定會明顯佔據這3微秒的時間。

  • .NET框架中的很多靜態方法在內部創建對象並調用它們的實例方法(可以通過查看參考源或使用某種反射工具來驗證這一點)。你假設靜態方法更快。不要做出這樣的假設。如果你有兩種方法來做同樣的事情,衡量哪一個更快。

+0

+1爲博客鏈接;很好的閱讀和發現,因爲我是一個C + +到C#轉換:)它仍然需要一些習慣於GC關注的地方,如果它真的是有效的,比你說得對,我的擔心是沒有根據的。謝謝 – Will

+0

分配很便宜,但清理可能不會。 –

相關問題