HDD-Benchmark liesst zu schnell ein
-
Ja, aber ich wollte es ja möglichst mit fstream machen...
-
Warum?
Mit Standard C++ ist es nicht möglich, das Caching abzuschalten. Das geht nur über betriebssystemspezifische Funktionen.
Oder machst du wirklich lieber sowas:
char* Huge = new char[ReallyHugeInt]; delete[] Huge;?

-
btw:
fstreams sind von vornherein gepuffert.
-
Ok, dann muss ich mich wohl geschlagen geben und WINAPI lernen.

So langsam glaube ich, dass es garkeinen Sinn mehr macht, zu versuchen, so viel wie möglich Standard-C++ zu proggen.
-
const int BUF_SIZE = 8 * 1024; BYTE *writeData = new BYTE[BUF_SIZE+1]; for(int j=0; j<BUF_SIZE; ++j) writeData[j] = random(255);Ehmm...für mich sieht es aber eher so aus, als ob Du 8 KB anstatt 8 MB gepuffert hast.
Die "+1" in "new BYTE[BUF_SIZE+1]; " kannst Du, soweit ich das sehe weglassen,
da Du ja in der Schleife nur bis zum (BUF_SIZE-1)ten Element gehst.
-
Jo, sorry. Da war ich in meinem Text um eine 1000er Potenz zu hoch. Mit KB hab ich irgendwie ein Problem :D, ich denk immer mit MB fängt alles an

Die "+1" hab ich nur drin, weil es ab und zu mal mit der Adressierung ein Problem gibt (zählt's von 0 oder von 1). Ein Byte mehr oder weniger, wen juckts, aber ich bekomm auf jeden Fall keinen bösen Programmabsturz wenn ich mal Programmteile von X nach Y verwende.
-
OK, wenn mans so sieht ...

Ich habe den Code grade mal getestet mit etwa 128 KB Cache liefert er bei mir ganz gute Ergebnisse: Segate - 32/32 WD: 42/43
Ich werde den Bechmark dann wohl auf dieser Basis weiter ausbauen.
Vielen Dank noch mal.
-
42/43 MB/s ???
Was hast du für einen Controller/CPU und wie schnell ist deine Platte (5400/7200/10000) ?
Sind ja irgendwie Traumwerte ?!
-
Kleine Frage am Rande:
Warum nimmst du nicht ein kostenloses ausgereiftes Tool zum HD-Benchmark und vergleichst die Werte mit denen deines Programms?
-
Naja, Eigenheim ist immer besser wie Miete !!!
-
cd9000 schrieb:
Warum nimmst du nicht ein kostenloses ausgereiftes Tool zum HD-Benchmark und vergleichst die Werte mit denen deines Programms?

-
Was ist denn ausgereift ? Was ist denn wenn beim BS Wechsel von X nach Y kein Update des ausgereiften Tools vorhanden ist ?
Also wenn es irgendwie möglich ist, verlasse/vergleiche ich die Situationen mit meinen eigenen Tools.
Ich möchte auch nur mit meinen eigenen Programmen die relativen Unterschiede zwischen System 1 und System 2 feststellen. Dann hab ich das in eigener Hand wenn z.B. die Hardware geändert wird.
-
Du scheinst nicht ganz zu verstehen, was ich meine.
Ich meine, woher willst du wissen, dass dein Programm richtige Werte liefert? Wenn du doch die richtigen richtigen Werte deiner Platte gar nicht kennst? Das Programm liefert vielleicht immer 10MB/s mehr als richtig ist. Ohne einen Vergleich merkst du das nie.
Also hol dir am besten irgendein Tool, mess die Geschwindigkeit deiner Platte damit und versuch herauszufinden, warum dein Tool andere Werte liefert (falls es andere liefert).
-
Doch, ich weiß was du meinst. Aber mir reicht der Vergleich von "meinem" Progamm auf unterschiedlichen Systemen. Ich muss nicht wissen ob das jetzt 10 MB/s sind oder 20 MB/s, sondern das mit dem gleichen Programm auf unterschiedlichen Systemen unterschiedliche Werte gemessen werden. Ich vergleiche da Prozentual.
-
Ich habe eine ganz normale Western Digital 80 GB, ATA 100, 7200 UPM, Dateisys.: NTFS.
Aber: Sie ist noch fast komplett leer und somit wohl kaum fragmentiert. Höchstwahrscheinlich kommen daher die grossen Werte.
Wenn ich allerdings 8 KB Puffer nehme komme ich auch auf geringere Werte. Grössere Werte, wie 256 KB oder 512 KB laufen bei mir besser.Mit SiSoft Sandra 2002 (30637 Punkte):
Sequential Read: 45 MB/s, Sequential Write 44 MB/s.
Random R/W: 8/10 MB/s
Buffered R/W: 86/87 MB/sMit anderen Tools, wie z.B. FreshDiagnose sind es etwa 12-18 MB/s weniger. (Wer weiss, wie die testen...die mixen vielleicht alles zusammen)
Naja, eigentlich ist jeder Benchmark ein bissl unrealistisch. Ich habe hier noch ein paar andere Tests gemacht u.a. mit VirtualDub (direkt Stream):
http://www.c-plusplus.net/forum/viewtopic.php?t=47552&postdays=0&postorder=asc&start=0Ich komme, wenn ich z.B. im Explorer von Platte zu Platte (nicht nur versch. Partitionen!) kopiere auf ca. 15 MB/s.
Ah, ich sehe grade, dass WoWe den Thread ja gestartet hat...so ein Zufall
-
So, ich habe das Programm mal noch ein wenig aufgewertet (Protokollierung + Fehlerabfang).
Meine Ergebnisse nach dem Test der 4 Partitionen (C ist dass vollste LW (600 MB frei), I und J sind fast leer):03.09.03 Laufwerk C: Schreiben: 21.9684 MB/s Lesen: 23.5868 MB/s 03.09.03 Laufwerk D: Schreiben: 31.6289 MB/s Lesen: 31.2728 MB/s 03.09.03 Laufwerk I: Schreiben: 46.0476 MB/s Lesen: 45.1739 MB/s 03.09.03 Laufwerk J: Schreiben: 44.1371 MB/s Lesen: 43.7382 MB/s#include <windows.h> #include <conio.h> #include <iostream> #include <fstream> #include <ctime> using namespace std; typedef unsigned long ulong; int main(void) { //Für den Schreib/Lesetest WINAPI verwenden, da fstream nur gepuffert arbeitet HANDLE hFile; char drive[] = "C"; char file[] = ":\\BENCH_TESTFILE.TMP"; char dir[256]; ulong bytesRead = 0, bytesWritten = 0, w_usedTime = 0, r_usedTime = 0, w_startTime = 0, r_startTime = 0; const int SIZE_TO_WRITE = 300 *1024 *1024; //Grösse der Testdatei in Byte const int BUF_SIZE = 256 *1024; //Puffergrösse char *readData = new char[BUF_SIZE]; char *writeData = new char[BUF_SIZE]; for(int j=0; j<BUF_SIZE; ++j) writeData[j] = '0'; cout << "Dies ist ein simpler Festplatten-Geschwindigkeitstest." << endl; cout << "Sie sollten mindestens " << SIZE_TO_WRITE/1024/1024 << " MB auf dem entspr. Laufwerk frei haben." << endl; cout << "Welches Laufwerk wollen Sie testen? (nur den Laufwerksbuchstaben eingeben)" <<endl << endl; cout << "Laufwerk: "; cin >> drive; if(drive[1] != '\0' || !((drive[0]>='a' && drive[0]<='z') || (drive[0]>='A' && drive[0]<='Z')) ){ cout << "Ungueltiges Laufwerk." << endl; getch(); return 0; } //in Laufwerksbuchstaben in Grossbuchstaben konvertieren if(drive[0]>='a' && drive[0]<='z') drive[0] += ('A' - 'a'); strcpy(dir, drive); strcat(dir, file); hFile = CreateFile(dir,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,NULL); if (hFile == INVALID_HANDLE_VALUE) return 0; cout << "Test wird gestartet:" << endl; cout << "Erzeuge temporaere Datei " << dir << endl; cout << "Schreibtest..." << flush; w_startTime = GetTickCount(); for(ulong i=0; i<SIZE_TO_WRITE; i+=bytesWritten){ WriteFile(hFile, writeData, BUF_SIZE, &bytesWritten, NULL); } CloseHandle(hFile); w_usedTime = (GetTickCount() - w_startTime); cout << w_usedTime << " ms" << endl; cout << "Lesetest..." <<flush; hFile = CreateFile(dir,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,NULL); if (hFile == INVALID_HANDLE_VALUE) return 0; r_startTime = GetTickCount(); for(ulong k=0; k<SIZE_TO_WRITE; k+=bytesRead){ ReadFile(hFile, readData, BUF_SIZE, &bytesRead, NULL); } CloseHandle(hFile); r_usedTime = (GetTickCount() - r_startTime); cout << r_usedTime << " ms" << endl; cout << "Loesche temporaere Datei " << dir << endl; remove(dir); delete[] readData; delete[] writeData; float w_transferrate = (SIZE_TO_WRITE/1024.0f/1024.0f)/(w_usedTime/1000.0f); float r_transferrate = (SIZE_TO_WRITE/1024.0f/1024.0f)/(r_usedTime/1000.0f); cout << "----------------------------------------------------------" << endl; cout << "Ergebnis des Tests: " << endl << endl; cout << "Tranferrate - schreiben: " << w_transferrate << " MB/s" << endl; cout << "Tranferrate - lesen : " << r_transferrate << " MB/s" << endl; //Protokollieren time_t t = time(NULL); tm *theTime = localtime(&t); ofstream out("bench_results.txt", ios::app); //Datum formatiert schreiben out.width(2); out.fill('0'); out << theTime->tm_mday <<"."; out.width(2); out.fill('0'); out << theTime->tm_mon+1 << "."; out.width(2); out.fill('0'); out << theTime->tm_year-100; out << " Laufwerk " << drive << ": Schreiben: " << w_transferrate << " MB/s Lesen: " << r_transferrate << " MB/s" << endl; out.close(); cout << "\nMoechten Sie mit die Ergebnisse mit vorherigen Tests vergleichen? (j/n) " << flush; if(getch() == 'j'){ system("cls"); ifstream in("bench_results.txt"); if(!in) return 0; char line[256]; while(!in.eof()){ in.getline(line, 256); cout << line << endl; } in.close(); getch(); } return 0; }