Benutzer mit den meisten Antworten
Schnellester File-Iterator, schnellester File-Reader, schnellester Memcmp

Frage
-
Hallo
ich will alle Dateien einer Verz.-Struktur auf binäre Gleichheit hin überprüfen,
d.h. die finden, bei denen Anzahl und Sequenz der Bytes übereinstimmen,
kurz Dupletten finden.
.NET System.IO bietet ja ein Enumerierungs-API an, auch FileStream
und FileReader, bauchmässig würde ich aber vermuten dass
die managed Versionen langsamer sind als die nativen Win32-Originale.
Frage 1: Ist dem so?
Zweite Frage: Ist FindFirstFile / FindNextFile am geeignetsten
oder gibt es Alternativen. Ich bin nur an Pfad / Name sowie Grösse der Dateien
interessiert, die anderen Felder von WIN32_FIND_DATA interessieren mich nicht.
Bei FindFirstFileEx kann man durch Angabe eines FINDEX_INFO_LEVELS
das befüllen des 8.3-Names unterdrücken, kann man auch ereichen das die Datumsfelder und
die Attribute leer bleiben?
Frage 3, was ist die effizientestes Art eine Datei sequentiell in "grossen" Blöcken
zu lesen, bei CreateFile kann man ein Flag FILE_FLAG_SEQUENTIAL_SCAN
setzen wodurch die "CacheBahaviour" auf sequentielles Lesen hin optimiert ist.
Macht sich sowas spürbar bemerkbar?
Mit welchen API-Methoden lese ich zwei Dateien am schnellsten und vergleiche ihren Inhalt binär?
ReadFile und RtlEqualMemory was für Alternativen gibt es?
Nützt mir SetFilePointerEx hier was?
Wozu ist asynchrone I/O gut?
Ist ein direktes memcmp besser als das RtlEqualMemory Macro?
Gibt es andere APIs für FileCompare?
Wovon ist die optimale Puffergrösse beim Lesen von Dateiblöcken abhängig?
Bei Dateien zwischen 500MB und 3GB, in was für Blöcken
liest man die auf dem PC am besten ein? 1MB, 32MB, 100MB 500MB / Leseschritt?
MfG
Christoph
Antworten
-
zu 1. Da der managed code intern auf die Windows API zugrieft muss es langsamer sein als der direkte weg. Allerdings vermute ich nur, dass dies marginal ist.
zu 2. Nein. Das aufzählen eines Verzeichnisses gescheiht genau über diese Funktionen. Es gibt keine anderen. Die Daten stehen doch soweiso in der Verzeichnisstruktur. Warum denkst Du das dasKopieren dieser paar Infos so viel Zeit kostet?
zu 3. bzgl. FILE_FLAG_SEQUENTIAL_SCAN IMHO Ja.
Ansonsten musst Du die Datei lesen, also geht auch kein Weg an ReadFile vorbei. Gleiches gilt für memcmp, RtlEuqalMemory. Die werden sich nichts nehmen. memcmp benutzt ein DWORD Compare, was kaum zu optimieren ist.
Was soll Dir SetFilePointerEx nutzen. Du weisst ja nicht wo ein Unterschied sein könnte. Und seeken könnte definitv zum Nachteil gegenüber sequentielem Lesen werden.
Ansychones IO entlastet Deinen Thread um auf dasErgebnis zu warten. Du kannst also evtl. schon teilweise Datenvergleichen während das OS noch Daten liest.
Nein es gibt keine API für FileCompare.Die Blockgrößen sind auch Abhängig von Ansynch IO oder nicht.
Größer als 1MB Datenblöcke zu machen bringt vermutlich gar nichts, da das OS sowieso dazwischen funken muss. Ich vermute sogar, dass Buffergößen über 100KB nichts bringen.Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort markiert Chris-von-der-Wiese Samstag, 3. März 2012 01:56
Alle Antworten
-
zu 1. Da der managed code intern auf die Windows API zugrieft muss es langsamer sein als der direkte weg. Allerdings vermute ich nur, dass dies marginal ist.
zu 2. Nein. Das aufzählen eines Verzeichnisses gescheiht genau über diese Funktionen. Es gibt keine anderen. Die Daten stehen doch soweiso in der Verzeichnisstruktur. Warum denkst Du das dasKopieren dieser paar Infos so viel Zeit kostet?
zu 3. bzgl. FILE_FLAG_SEQUENTIAL_SCAN IMHO Ja.
Ansonsten musst Du die Datei lesen, also geht auch kein Weg an ReadFile vorbei. Gleiches gilt für memcmp, RtlEuqalMemory. Die werden sich nichts nehmen. memcmp benutzt ein DWORD Compare, was kaum zu optimieren ist.
Was soll Dir SetFilePointerEx nutzen. Du weisst ja nicht wo ein Unterschied sein könnte. Und seeken könnte definitv zum Nachteil gegenüber sequentielem Lesen werden.
Ansychones IO entlastet Deinen Thread um auf dasErgebnis zu warten. Du kannst also evtl. schon teilweise Datenvergleichen während das OS noch Daten liest.
Nein es gibt keine API für FileCompare.Die Blockgrößen sind auch Abhängig von Ansynch IO oder nicht.
Größer als 1MB Datenblöcke zu machen bringt vermutlich gar nichts, da das OS sowieso dazwischen funken muss. Ich vermute sogar, dass Buffergößen über 100KB nichts bringen.Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort markiert Chris-von-der-Wiese Samstag, 3. März 2012 01:56