Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   GetFileSize - welches ist die bessere Funktion? (https://www.delphipraxis.net/194137-getfilesize-welches-ist-die-bessere-funktion.html)

Jasocul 23. Okt 2017 12:10

AW: GetFileSize - welches ist die bessere Funktion?
 
Das bestätigt dann ja deine Annahme.
OK, war eigentlich abzusehen, da ja FileExists, FindFirst und FindClose in der D-Variante gar nicht vorkommen. Aber dieser Performance-Test war ja noch einfach. Bei komplizierteren Sachen, die nicht so offensichtlich sind, muss man schon genauer testen. Und darum ging es mir an dieser Stelle.

Uwe Raabe 23. Okt 2017 12:25

AW: GetFileSize - welches ist die bessere Funktion?
 
Zitat:

Zitat von Jasocul (Beitrag 1383938)
Bei komplizierteren Sachen, die nicht so offensichtlich sind, muss man schon genauer testen. Und darum ging es mir an dieser Stelle.

Um strukturelle Fehler im Testaufbau zu finden, sollte man die verschiedenen Durchläufe zunächst immer mit derselben Implementierung laufen lassen (hier alle Messungen erst mit A, dann B usw.). Wenn dann immer die erste Messung signifikant schlechter ist als die folgenden (z.B. wegen des Cache), sollte man den Test solange verbessern bis das ausgeglichen ist.

Das ist so in etwa das Pendant zum Test-Driven Development, bei dem man einen Test bewusst fehlschlagen lässt, um erstmal den Test-Harness zu überprüfen.

Glados 23. Okt 2017 12:59

AW: GetFileSize - welches ist die bessere Funktion?
 
Alles erledigt was ihr vorgeschlagen habt.

Resultat:
A = 2 Minuten, 45 Sekunden
D = 31 Sekunden

Benmik 2. Apr 2024 15:23

AW: GetFileSize - welches ist die bessere Funktion?
 
Aus gegebenem Anlass habe ich mal gemessen, wie die Funktion GetFileInformationByHandle, mit der auch die Dateigröße bestimmt werden kann, sich schlägt. Hierbei wurde die Zeit bei GetFileAttributesEx und GetFileInformationByHandle für die Verarbeitung von etwa 165.000 Dateien mit zusammen > 3 TB von einer SSD gemessen. Die Messungen erfolgten einerseits nach Rechner-Neustart und dann beim erneuten Einlesen, andererseits mit Defender Antivirus (Windows 10, Echtzeitschutz + Manipulationsschutz) und ohne.

DateiInfoByHandle  
Neustart mit Defender 660 sec (!)
Neustart ohne Defender 11-14 sec
Zweitstart mit Defender 10-21 sec
Zweitstart ohne Defender 14-22 sec

GetFileAttributesEx
Neustart mit Defender 8 sec
Neustart ohne Defender 5 sec
Zweitstart mit Defender 5 sec
Zweitstart ohne Defender 5 sec

Der Defender Antivirus macht GetFileInformationByHandle ja fast unbrauchbar. Gibt es da ein Gegenmittel?

himitsu 2. Apr 2024 15:42

AW: GetFileSize - welches ist die bessere Funktion?
 
Zitat:

Zitat von Benmik (Beitrag 1535210)
Gibt es da ein Gegenmittel?

Nicht alles einzeln abfragen und dafür auch noch jede Datei öffnen, damit der Defender jeder Live-Scanner nicht gezwungen wird sich alle Dateien anzusehn :roll: :freak:


MSDN-Library durchsuchenFindFirstFileEx mit FIND_FIRST_EX_LARGE_FETCH

himitsu 2. Apr 2024 15:44

AW: GetFileSize - welches ist die bessere Funktion?
 
[deleted]

Benmik 2. Apr 2024 17:29

AW: GetFileSize - welches ist die bessere Funktion?
 
Schwer zu verstehen. Wie soll das gehen, nicht alle einzeln abzufragen? Ein Test mit dem direkten Aufruf von FindFirstFileExW ergab Zeiten zwischen 13 und 19 Sekunden, also wesentlich langsamer als GetFileAttributesEx. Der Aufruf von GetFileInformationByHandle lässt sich nicht umgehen, da ich die Anzahl der Links und den File Index benötige.

Die Dateigröße benötige ich nur, um festzustellen, ob Dateigleichheit in Frage kommt. Immerhin weiß ich jetzt, dass es etwas bringt, die Dateigrößen zuerst mit GetFileAttributesEx zu ermitteln, um alle diejenigen Dateigrößen auszusondern, die nur einmal vorkommen.

jaenicke 2. Apr 2024 18:31

AW: GetFileSize - welches ist die bessere Funktion?
 
Zitat:

Zitat von Benmik (Beitrag 1535215)
Schwer zu verstehen. Wie soll das gehen, nicht alle einzeln abzufragen? Ein Test mit dem direkten Aufruf von FindFirstFileExW ergab Zeiten zwischen 13 und 19 Sekunden, also wesentlich langsamer als GetFileAttributesEx.

Du fragst aber nicht etwa jede Datei einzeln so ab, oder?

Es geht ja eben darum, dass du die Anzahl der Abfragen reduzierst. Sprich dass du auf diese Weise gleich alle Dateien in einem Verzeichnis durchgehst.

Benmik 2. Apr 2024 21:00

AW: GetFileSize - welches ist die bessere Funktion?
 
Wie soll ich die nicht alle einzeln abfragen? Ich brauche die Daten für jede einzelne Datei. Ich habe eine Klasse
Delphi-Quellcode:
TDat
und eine
Delphi-Quellcode:
TObjectList<TDat>
, lese die Dateien mittels
Delphi-Quellcode:
TDirectory.GetFiles
in ein
Delphi-Quellcode:
TStringDynArray
ein und lege für jede Datei eine Instanz von TDat an. Bisher habe ich das mit GetFileInformationByHandle gemacht und von allen Dateien die entsprechenden Felder gefüllt; jetzt denke ich, dass ich viel Zeit spare, wenn ich mit GetFileAttributesEx erst einmal die herausfiltere, deren Bytegröße nur einmal vorkommt, und erst dann die verbliebenen mit GetFileInformationByHandle bearbeite. Das wäre nicht nötig, wenn der Defender Antivirus die Aktion nicht so wahnsinnig verlangsamen würde, aber da ist vermutlich nichts zu machen.

Uwe Raabe 2. Apr 2024 21:11

AW: GetFileSize - welches ist die bessere Funktion?
 
Du könntest das TDirectory.GetFiles overload nehmen, das ein TFilterPredicate akzeptiert. In dem Filter hast du Zugriff auf SearchRec.Size.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz