2012-02-07 36 views
21

Tôi đang sử dụng fs.Length, trong đó fsFileStream.Cách nhanh nhất để đọc chiều dài tệp C#

Đây có phải là hoạt động O(1) không? Tôi sẽ nghĩ rằng điều này sẽ chỉ đọc từ các thuộc tính của tập tin, như trái ngược với đi qua các tập tin để tìm khi vị trí tìm kiếm đã đạt đến kết thúc. Tệp tôi đang cố gắng tìm độ dài có thể dễ dàng nằm trong khoảng từ 1 MB đến 4-5 GB.

Tuy nhiên tôi nhận thấy rằng có một lớp học FileInfo, cũng có thuộc tính Length.

Cả hai thuộc tính này đều có cùng một khoảng thời gian không? Hoặc không phải là fs.Length chậm hơn vì trước tiên nó phải mở FileStream?

Trả lời

30

Cách tự nhiên để có kích thước tệp trong .NET là thuộc tính FileInfo.Length mà bạn đã đề cập.

Tôi không chắc chắn Stream.Length chậm hơn (nó sẽ không đọc toàn bộ tệp), nhưng chắc chắn sẽ tự nhiên hơn khi sử dụng FileInfo thay vì FileStream nếu bạn không định đọc tệp.


Dưới đây là một chuẩn mực nhỏ sẽ cung cấp một số giá trị số:

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(); 
} 

Kết quả:

Stream: 886 
FileInfo: 727 
+0

xấu xa, cảm ơn thông tin thời gian! – jpints14

+1

Đo điểm chuẩn theo cách đó có thể không phải là cách hiệu quả nhất để kiểm tra sự khác biệt (nếu có). Tôi tưởng tượng đĩa đệm/os yếu tố sẽ được chơi một phần đáng kể trong việc giữ thời gian xuống. – PaulG

+0

@PaulG Bạn đúng vậy. Điểm chuẩn là ** luôn ** phức tạp hơn vẻ bề ngoài. Chỉ tiêu đơn giản ở trên ** chỉ ** cho chỉ báo _some về kết quả thực tế. Vì nó không trả về 100000 so với 250, tôi nghĩ rằng có thể kết luận rằng cả hai phương thức đều không có quá nhiều khác biệt (về thời gian tính toán). – ken2k

23

Cả hai đều sẽ truy cập siêu dữ liệu hệ thống tệp thay vì đọc toàn bộ tệp. Tôi không biết cái nào hiệu quả hơn, theo nguyên tắc, tôi muốn nói rằng nếu bạn chỉ muốn biết độ dài (và siêu dữ liệu khác), hãy sử dụng FileInfo - trong khi nếu bạn mở tệp dưới dạng tuy nhiên, hãy sử dụng FileStream.Length.

+0

Cảm ơn bạn Ông Skeet! – jpints14

Các vấn đề liên quan