Warum ist EnumerateFiles viel schneller als die Berechnung der Größen

8

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?

    
MyDaftQuestions 22.04.2015, 14:06
quelle

2 Antworten

8

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.

    
BrokenGlass 22.04.2015, 14:15
quelle
-1

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.

    
James Lucas 22.04.2015 14:10
quelle

Tags und Links