2011-09-28 21 views
31

Tôi biết theo cách thông thường nhận được kích thước của một tập tin sẽ được sử dụng một trường hợp FileInfo:Có cách nào để lấy kích thước của tệp trong .NET bằng phương pháp tĩnh không?

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

Có cách nào để làm điều tương tự mà không cần phải tạo ra một thể hiện của FileInfo, sử dụng một tĩnh phương pháp?

Có lẽ tôi đang cố gắng quá keo kiệt với việc tạo một cá thể mới mỗi khi tôi muốn kích thước tệp, nhưng hãy thử tính toán tổng kích thước của một thư mục chứa 5000 tệp. Khi tối ưu hóa như GC có thể được, không nên có một cách để làm điều này mà không cần phải nộp thuế không cần thiết?

+2

Bạn có chắc chắn rằng đây là nút cổ chai của ứng dụng của bạn? Tôi đoán không thì tại sao bận tâm. – Andrey

+6

@Andrey Nó không phải là quá nhiều vì nó là một nút cổ chai vì nó là một câu hỏi về việc sử dụng hiệu quả ngôn ngữ và bộ thu gom rác. Những điều như vậy luôn đáng để đặt câu hỏi, đặc biệt nếu bạn không quen thuộc với sắc thái của GC. Đây không phải là lần đầu tiên tôi bị buộc tội quá tối ưu hóa, nhưng tôi thay vì lo lắng về việc quá lo lắng về những thứ như vậy thay vì không làm phiền. Bên cạnh đó, nó không mất nhưng một vài phút để đặt một câu hỏi. – Will

Trả lời

14

Đừng lo lắng về điều đó. Đầu tiên, phân bổ trong .NET là giá rẻ. Thứ hai, đối tượng đó sẽ nằm trong gen 0, vì vậy nó sẽ được thu thập mà không cần tốn nhiều chi phí.

+2

Tôi đã nghĩ rằng, nhưng là một anh chàng C++ cũ, một số thói quen cũ về tối ưu hóa/hiệu quả chết cứng. – Will

+4

@Tôi có cảm giác rằng việc làm việc nội bộ của FileInfo tăng thêm nhiều chi phí hơn so với phân bổ và GC của chính đối tượng đó. Ngoài ra còn có quy tắc ngón tay cái phù hợp - hãy tiết kiệm thời gian của bạn trước. Nếu nó không phải là một nút cổ chai, đừng bận tâm. Thông thường các tối ưu hóa nhỏ không đáng giá tiền mà chủ lao động của bạn trả cho bạn trong khi bạn đang bận rộn tối ưu hóa (ít nhất là trong mắt của chủ nhân). Vì vậy, lời khuyên của tôi: concider nó một thói quen xấu và không bận tâm. ;) – Dmitry

15

Đừng lo lắng về điều đó.

  • Tôi đã tìm thấy một bài viết trên blog của một người đã đo chi phí của việc tạo ra đối tượng trong .NET (C# Object Creation Time Trials), và, khi nó quay ra, tạo ra 10.000 đối tượng mất 0.03 giây, tức là 3 ms mỗi đối tượng . Thời gian cần thiết để đọc chiều dài tập tin từ hệ thống tập tin chắc chắn sẽ thống trị đáng kể 3 micro giây đó. Có rất nhiều phương pháp tĩnh trong khuôn khổ .NET trong nội bộ tạo ra các đối tượng và gọi phương thức cá thể trên chúng (bạn có thể xác minh điều này bằng cách nhìn vào nguồn tham chiếu hoặc bằng cách sử dụng một số công cụ phản chiếu). Bạn giả sử rằng phương pháp tĩnh nhanh hơn. Đừng đưa ra những giả định như vậy. Nếu bạn có hai cách để làm điều tương tự, hãy xem đo cái nào nhanh hơn.

+0

+1 cho liên kết blog; tốt đọc, và tại chỗ kể từ khi tôi là một C++ - to-C# chuyển đổi :) Nó vẫn đang dùng một số nhận được sử dụng để GC là có liên quan, và nếu nó thực sự là hiệu quả, hơn bạn phải, mối quan tâm của tôi là không có cơ sở . Cảm ơn – Will

+0

Phân bổ rất rẻ, nhưng việc dọn dẹp có thể không được. –

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