- Offizieller Beitrag
Ihr kennt vielleicht das Tool "h2testw" vom Heise-Verlag zum testen von USB-Sticks bzw. überhaupt von Laufwerken.
Jetzt dachte ich mir, dass ich sowas mal mit AutoIt schreibe.
Doch schnell stellte sich raus, dass AutoIt zu langsam ist, um den Schreibpuffer schnell genug mit Daten zu füllen. Ich hatte einen Schreibpuffer von 8 MB im Sinn und eine Dateigröße von jeweils 1 GB.
Nun will ich aber nicht einen 8 MB-Speicher im vorraus füllen und den dann immer wieder in die Datei schreiben, sondern die 1 GB Daten sollen schon unterschiedlich sein und das schafft AutoIt nicht schnell genug.
Also habe ich mal wieder etwas in Assembler geschrieben. Das ist dann so ca. 3000 mal schneller.
Im Moment ist das erstmal nur ein Script (ohne GUI): siehe Anhang.
Edit 06.12.2018: Neue Version!
Jetzt mit Schreib- und Leseroutine.
Auch die Leseroutine benutzt eine Assemblerroutine zum testen des Lesepuffers.
Das untenstehende Problem habe ich lösen können (Google sei Dank): _WinAPI_CreateFileEx() mit $FILE_FLAG_NO_BUFFERING
Das "Problem" ist jetzt, dass ich nicht weiß, warum das Lesen so schnell geht. Ich habe schon TimerInit und TimerDiff durch _WinAPI_GetTickCount() ersetzt, weil ich dachte, dass da irgendwas mit dem Timer nicht stimmt, aber daran lag es nicht.
Dann habe ich mit HxD (externer Hexeditor) in der dritten 1-GB-Datei ein einzelnes DWORD geändert, um zu testen, ob meine Assemblerfunktion richtig arbeitet. Aber auch dieses eine geänderte DWORD wird korrekt erkannt und angezeigt.
Meine Leseroutine muss also wirklich die Daten einlesen, aber mit über 2000 MB/s? Da muss irgendein Cache seine Finger im Spiel haben. Aber ein 4 GB großer Cache? Laut Taskmanager hat mein Arbeitsspeicher nur eine Auslastung von 2.71 GB.
Jetzt liefert das Script realistische Werte. Hier mal die Werte von meiner neuen "M.2 SSD im USB3-Gehäuse" (habe ich mir als USB-Stick-Ersatz gegönnt):
FillBuffer-ASM-Code-Size: 34 Bytes
CheckBuffer-ASM-Code-Size: 50 Bytes
Schreibe Datei: "s:\temp\0001.ft"
Zeit: 13.213 s
Schreibrate: 77.5 MB/s
Schreibe Datei: "s:\temp\0002.ft"
Zeit: 13.198 s
Schreibrate: 77.6 MB/s
Schreibe Datei: "s:\temp\0003.ft"
Zeit: 13.088 s
Schreibrate: 78.2 MB/s
Schreibe Datei: "s:\temp\0004.ft"
Zeit: 13.869 s
Schreibrate: 73.8 MB/s
Lese Datei: "s:\temp\0001.ft"
Zeit: 4.165 s
Leserate: 245.9 MB/s
Lese Datei: "s:\temp\0002.ft"
Zeit: 4.196 s
Leserate: 244.0 MB/s
Lese Datei: "s:\temp\0003.ft"
Zeit: 4.134 s
Leserate: 247.7 MB/s
Lese Datei: "s:\temp\0004.ft"
Zeit: 4.041 s
Leserate: 253.4 MB/s
Alles anzeigen