2009-11-23 30 views
5

Chúng tôi đã gặp sự cố hiệu suất không mong muốn khi duyệt qua các thư mục tìm kiếm tệp bằng mẫu ký tự đại diện.Tính năng FindFirstFile và FindNextFile của Win32 API so với dòng lệnh

Chúng tôi có 180 thư mục chứa 10.000 tệp. Tìm kiếm dòng lệnh bằng cách sử dụng dir <pattern> /s hoàn thành gần như ngay lập tức (< 0,25 giây). Tuy nhiên, từ ứng dụng của chúng tôi cùng một tìm kiếm mất từ ​​3-4 giây.

Ban đầu, chúng tôi đã thử sử dụng System.IO.DirectoryInfo.GetFiles() với SearchOption.AllDirectories và hiện đã thử các cuộc gọi API Win32 FindFirstFile()FindNextFile().

Lập cấu hình mã của chúng tôi bằng cách chỉ ra rằng phần lớn thời gian thực hiện được chi cho các cuộc gọi này.

Mã của chúng tôi được dựa trên bài đăng blog sau đây:

http://codebetter.com/blogs/matthew.podwysocki/archive/2008/10/16/functional-net-fighting-friction-in-the-bcl-with-directory-getfiles.aspx

Chúng tôi thấy điều này để được làm chậm để cập nhật các GetFiles chức năng để có một mô hình string tìm kiếm chứ không phải là một vị.

Có ai có thể làm sáng tỏ những gì có thể sai với cách tiếp cận của chúng tôi không?

+0

bạn đang sử dụng công cụ nào để thực hiện tìm kiếm từ dòng lệnh? Nó có thể được rằng nó đang sử dụng các chỉ mục tìm kiếm Windows để làm các truy vấn chứ không phải là bước qua tất cả các tập tin? –

+0

@Matt chúng tôi chỉ đang thực hiện một 'dir/s' (đã cập nhật bài đăng của tôi cho phù hợp). –

+1

Âm thanh đáng ngờ. Tôi nghiêm túc nghi ngờ rằng "dir" sử dụng bất cứ điều gì khác ngoại trừ FindFirstFile/FindNextFile là tốt. Có thể bạn lạm dụng chúng. Bạn có thể cung cấp đoạn trích minh họa cách bạn sử dụng chúng không? – sharptooth

Trả lời

2

Bạn có thể thử với triển khai FindFirstFileFindNextFile Tôi một lần blogged.

+0

Cách tiếp cận của chúng tôi rất giống với Darin –

+0

Tôi đã thử nghiệm giải pháp của mình và mất 230 mili giây liệt kê một thư mục chứa> 100K tệp. –

+0

Tăng tốc thêm có thể đạt được với 'FindFirstFileEx (... FindExInfoBasic ...)' – MSalters

0

Hãy thử IShellFolder::EnumObjects với SHGetDataFromIDList/IShellFolder::GetAttributesOf.

Pro/Cons here.

7

Trong các thử nghiệm của tôi sử dụng FindFirstFileEx với FindExInfoBasicFIND_FIRST_EX_LARGE_FETCH là nhanh hơn nhiều so với đồng bằng FindFirstFile.

Quét 20 thư mục với ~ 300.000 tệp mất 661 giây với FindFirstFile và 11 giây với FindFirstFileEx. Các cuộc gọi tiếp theo đến cùng một thư mục mất chưa đầy một giây.

HANDLE h = FindFirstFileEx (search.c_str(), FindExInfoBasic, & dữ liệu, FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);

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