Wir haben ein unerwartetes Leistungsproblem beim Durchlaufen von Verzeichnissen auf der Suche nach Dateien mit einem Platzhaltermuster aufgetreten.Win32 API FindFirstFile und FindNextFile Leistung vs Befehlszeile
Wir haben 180 Ordner mit jeweils 10.000 Dateien. Eine Befehlszeilensuche mit dir <pattern> /s
wird fast sofort abgeschlossen (< 0,25 Sekunden). Allerdings dauert die Suche in unserer Anwendung zwischen 3 und 4 Sekunden.
Wir versuchten zunächst System.IO.DirectoryInfo.GetFiles()
mit SearchOption.AllDirectories
mit und haben versucht nun die Win32-API FindFirstFile()
und FindNextFile()
aufruft.
Profiling unserer Code mit zeigt an, dass die überwiegende Mehrheit der Ausführungszeit für diese Anrufe ausgegeben wird.
Unser Code ist auf der folgenden Blog-Post basiert:
Wir fanden diese aktualisiert, so langsam zu sein, um die GetFiles
Funktion ein string
Suchmuster eher als ein Prädikat zu nehmen.
Kann jemand Licht in die Frage bringen, was mit unserem Ansatz falsch sein könnte?
Was verwenden Sie für die Suche über die Befehlszeile? Könnte es sein, dass es die Windows-Suchindizes verwendet, um die Abfrage durchzuführen, anstatt jede Datei durchzugehen? –
@Matt Wir machen nur ein 'dir/s' (habe meinen Beitrag entsprechend aktualisiert). –
Klingt verdächtig. Ich bin mir ernsthaft sicher, dass "dir" alles andere als FindFirstFile/FindNextFile verwendet. Vielleicht missbrauchst du sie. Könnten Sie einen Ausschnitt bereitstellen, der veranschaulicht, wie Sie sie verwenden? – sharptooth