Đối với dự án WPF của tôi, tôi phải tính tổng kích thước tệp trong một thư mục duy nhất (có thể có các thư mục phụ).Tại sao EnumerateFiles nhanh hơn nhiều so với việc tính toán các kích thước
Sample 1
DirectoryInfo di = new DirectoryInfo(path);
var totalLength = di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length);
if (totalLength/1000000 >= size)
return true;
Sample 2
var sizeOfHtmlDirectory = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
long totalLength = 0;
foreach (var file in sizeOfHtmlDirectory)
{
totalLength += new FileInfo(file).Length;
if (totalLength/1000000 >= size)
return true;
}
Cả hai mẫu làm việc.
Mẫu 1 hoàn thành trong thời gian nhanh hơn. Tôi đã không định thời gian này chính xác nhưng trên PC của tôi, sử dụng cùng một thư mục có cùng kích thước nội dung/tệp, Mẫu 1 mất vài giây, Mẫu 2 mất vài phút.
EDIT
Tôi phải chỉ ra, cổ chai trong mẫu 2 là trong vòng lặp foreach! Nó đọc GetFiles một cách nhanh chóng và nhanh chóng đi vào vòng lặp foreach.
Câu hỏi của tôi là, làm cách nào để tìm hiểu lý do tại sao lại xảy ra trường hợp này?
Có thể là do với 'GetFiles', trước tiên bạn phải liệt kê tất cả các tệp trước khi trả về một kết quả. Hãy thử thêm một 'ToArray()' trước '.Sum' – xanatos
Và bạn thậm chí có thể thử' Directory.EnumerateFiles'/'DirectorInfo.GetFiles' – xanatos
Bạn cũng đã so sánh nó với phương pháp tiếp cận mà bạn sử dụng một' DirectoryInfo' làm gốc và 'dirInfo.GetFiles' để nhận tất cả các đối tượng' FileInfo'? –