Für mein WPF-Projekt muss ich die gesamte Dateigröße in einem einzigen Verzeichnis berechnen (das Unterverzeichnisse enthalten kann).
Beispiel 1
%Vor%Beispiel 2
%Vor%Beide Beispiele funktionieren.
Probe 1 wird in einer wesentlich schnelleren Zeit abgeschlossen. Ich habe dies nicht genau gemessen, aber auf meinem PC, mit dem gleichen Ordner mit den gleichen Inhalt / Dateigrößen, dauert Sample 1 ein paar Sekunden, Sample 2 dauert ein paar Minuten.
BEARBEITEN
Ich sollte darauf hinweisen, dass der Flaschenhals in Probe 2 innerhalb der foreach Schleife ist! Es liest die GetFiles schnell und tritt schnell in die foreach-Schleife ein.
Meine Frage ist, wie finde ich heraus, warum dies der Fall ist?
Im Gegensatz zu den anderen Antworten ist der Hauptunterschied nicht EnumerateFiles
vs GetFiles
- es ist DirectoryInfo
vs Directory
- im letzteren Fall haben Sie nur Strings und müssen neue FileInfo
Instanzen separat erstellen Das ist sehr teuer.
DirectoryInfo
gibt FileInfo
Instanzen zurück, die zwischengespeicherte Informationen verwenden, anstatt direkt neue FileInfo
Instanzen zu erstellen, was nicht der Fall ist - weitere Details hier und hier .
Relevantes Zitat (über "The Old New Thing"):
In NTFS sind Dateisystem-Metadaten eine Eigenschaft, die nicht dem Verzeichniseintrag entspricht aber eher von der Datei, mit einigen der replizierten Metadaten in die Verzeichniseintrag als Optimierung, um die Verzeichnisaufzählung zu verbessern Performance. Funktionen wie FindFirstFile melden das Verzeichnis und die Metadaten, die FAT-Benutzer gewohnt waren, "kostenlos" bekommen, könnten sie vermeiden, langsamer als FAT zu sein Verzeichnislisten. Die Verzeichnisaufzählungsfunktionen melden das Zuletzt aktualisierte Metadaten, die möglicherweise nicht den tatsächlichen Metadaten entsprechen wenn der Verzeichniseintrag veraltet ist.
EnumerateFiles ist asynchron, während GetFiles wartet, bis alle Dateien aufgelistet sind, bevor die Auflistung der Dateien zurückgegeben wird. Dies wird sich stark auf Ihr Ergebnis auswirken.