我正在使用fs.Length
,其中fs
是FileStream
。讀取文件長度最快的方法C#
這是一個O(1)
操作?我認爲這只是從文件的屬性中讀取,而不是通過文件來查找查找位置何時達到結尾。我試圖找到的文件的長度可以很容易地從1 MB到4-5 GB的範圍。
但是我注意到有一個FileInfo
類,它也有一個Length
屬性。
這兩個Length
屬性在理論上是否需要相同的時間?或者是fs.Length
較慢,因爲它必須首先打開FileStream
?
我正在使用fs.Length
,其中fs
是FileStream
。讀取文件長度最快的方法C#
這是一個O(1)
操作?我認爲這只是從文件的屬性中讀取,而不是通過文件來查找查找位置何時達到結尾。我試圖找到的文件的長度可以很容易地從1 MB到4-5 GB的範圍。
但是我注意到有一個FileInfo
類,它也有一個Length
屬性。
這兩個Length
屬性在理論上是否需要相同的時間?或者是fs.Length
較慢,因爲它必須首先打開FileStream
?
在.NET中獲取文件大小的自然方法是您提到的FileInfo.Length屬性。
我不知道Stream.Length
較慢(它不會去讀整個文件反正),但它肯定更自然的使用FileInfo
代替FileStream
的,如果你不打算讀取該文件。
這裏有一個小的基準,它會提供一些數值:
private static void Main(string[] args)
{
string filePath = ...; // Path to 2.5 GB file here
Stopwatch z1 = new Stopwatch();
Stopwatch z2 = new Stopwatch();
int count = 10000;
z1.Start();
for (int i = 0; i < count; i++)
{
long length;
using (Stream stream = new FileStream(filePath, FileMode.Open))
{
length = stream.Length;
}
}
z1.Stop();
z2.Start();
for (int i = 0; i < count; i++)
{
long length = new FileInfo(filePath).Length;
}
z2.Stop();
Console.WriteLine(string.Format("Stream: {0}", z1.ElapsedMilliseconds));
Console.WriteLine(string.Format("FileInfo: {0}", z2.ElapsedMilliseconds));
Console.ReadKey();
}
結果:
Stream: 886
FileInfo: 727
兩者都將訪問文件系統元數據,而不是讀取整個文件。我不知道哪個更有效率,作爲一個經驗法則我會說,如果你只有想知道長度(和其他元數據),使用FileInfo
- 而如果你打開文件作爲無論如何,請使用FileStream.Length
。
謝謝飛碟雙向先生! – jpints14 2012-02-07 15:17:15
邪惡,感謝您的時間信息! – jpints14 2012-02-07 15:29:42
以這種方式進行基準測試可能不是測試差異的最有效方法(如果有的話)。我認爲磁盤緩存/操作系統因素將在保持時間下降方面發揮重要作用。 – PaulG 2012-02-07 16:05:41
@PaulG你是如此的正確。標杆管理**總是**比看起來更復雜。上面的簡單基準**僅給出關於實際結果的一些指示。因爲它不會返回100000比250,所以我認爲有可能得出這樣的結論:兩種方法都沒有太大差別(就計算時間而言)。 – ken2k 2012-02-07 16:13:50