![]() |
Festplattenzugriff messen
hallo,
ich habe vor mir ein kleiens diagnosetool zubasteln, welches mir verrät wie schnell der PC einen gewisse anzahl von bytes auf die festplatte schreiben kann. Wie mache ich das am besten? Soll ich die Timer Komponente mit verwenden und wie kann ich schnell die datei speichern bzw. viele Zeichen in kurzer Zeit erzeugen? ich denke die datei sollte dann max. 2 MB groß werden. MFG & thx Flattman |
Performance Test der Festplatte
Hallo Flatman,
Am besten, Du speicherst die gemessene Zeit direkt in Deine Testdatei und wertest Sie dann später aus. Gruß, Tom |
jp, so hatte ich mir das auch schon gedacht, nur muss ic ja irgendwo datenherbekommen und das immmer schnellst möglich. die datei soll ja um die 2MB haben damit das messen überhaupt richtig geht.
|
Schreib doch die Daten mit BlockRead und mess jeweils, wie lange er für einen Block gebraucht hat und zum Schluß erstellst du die Statistik. Ob das jetzt aber so genau ist, weiß ich auch nicht das es auch stark von der Blockgröße abhängt. Idealerweise sollte sie ein Vielfaches von der Sektorgröße sein.
|
Nicht zu vergessen ist der Cache. Zum einen der Windows-Softwarecache, und zum anderen der Hardwarecache in der Festplatte. Der Cache ist in jedem fall viel schneller als die Festplatte selbst.
Du müsstest den Controller (den IDE-, bzw SCSI-Controller natürlich) direkt ansprechen (Assembler) und ihm zufällige Datenfolgen an die Festplatte schicken lassen. Und selbst das ist noch zu ungenau, weil die Festplatte selbst mittlerweile ja auch Caches im Megabyte-Bereich hat. Ob man die Festplatte direkt zum Schreiben bewegen kann, entzieht sich meines Wissens. Am Sichersten ist es, extrem große Datenblöcke zu nehmen, die in keinen Cache mehr passen |
Hallo flattman,
zu Assembler- und Turbo-Pascal-Zeiten konnte man, wenn ich mich recht entsinne, mit Interupt 14 direkt auf den Datenträger zugreifen. Für ein Test-Tool ist das aber sicherlich nicht sinnvoll, weil die "normalen" Schreib-Lese-Zugriffe von Anwender-Software ja auch über die standardisierten Schnittstellen erfolgt. Cache würde ich auch nicht ausschalten, schließlich ist der ja dafür da, das System zu beschleunigen. 2 MB Daten erscheint aber doch arg wenig. Je mehr Daten, desto genauer dürfte der Durchschnittswert ausfallen. Ich würde die Datenmenge einstellbar machen 1 MB bis 20 GB oder was immer so auf einer Partition frei ist. Der Buffer mit den zu schreibenden Daten wäre bei mir ein Vielfaches von 1024 Byte, ich würde 64 k nehmen. Ob mit Nullen oder Einsen gefüllt dürfte egal sein, da diese sich beim Schreiben wohl nur in der Ausrichtung der Magnetschicht auswirken. Für jedes geschrieben Bit muß aber eine Magnetisierung erfolgen. Ob Nullen oder Einsen länger dauern ließe sich ja dann testen. Startzeit und Endzeit zum Füllen des Puffers merken, den Vorgang einige Male wiederholen, dann dürften die Durchschnittswerte ziemlich genau ausfallen und unterschiedliche Systeme vergleichbar werden. mfg eddy |
hallo eddy
Code:
Ja das waren noch zeiten heute sperrt windows ja alle interrrupszugriffe. Leider. Ich habe schon oft das Problem gehabt.
zu Assembler- und Turbo-Pascal-Zeiten konnte man, wenn ich mich recht entsinne, mit Interupt 14 direkt auf den Datenträger zugreifen.
Aber du hast recht der Anwender muss ja auch den Cache benutzen, denn will ich ja nicht mit ausschließen. Ich werde das so machen wie du vorgeschlagen hast, erstmal einen Stream mit 1em oder 0en füllen so auf 16 MB und dann schreiben lasssen. das dürfte ganz gut gehen, das ganze dann 10 mal hintereinander und dan den mittelwert, den meist dauert das speichern nur 1 sekunde. Deshalb ist es ein wenig unglücklich sich die STart und Endzit zu merken und dann die Differenz davon auszugeben. Gibt es denn nicht ne andere möglichkeit die zeit zumessen? ICh habe es mal mit timer versucht aber derstartet nicht, der gibt immer nur 0 aus und fertig ist obwohl der milisekunden ausgeben sollte. MFG Flattman |
ich glaube für windows stellt ne ziemlich genaue methode bereit, bin mir aber nicht ganz sicher:
such mal nach gettickcount hier im forum. MfG |
Hallo flattman, MadMason hat Recht:
Mit GetTickCount kriegst du die Anzahl der vergangenen Millisekunden seit Systemstart. So kannst du ziemlich genau die verlaufene Zeit messen.
Delphi-Quellcode:
MfG, Sebastian
var
start, ms: integer; begin start := GetTickCount; { mach deine Aktionen... } ms := GetTickCount - start; //jetzt steht in ms die vergangene Zeit in Millisekunden. end; |
ok thx
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz