fstreams - gibt es noch etwas Schnelleres?
-
Die fstreams sind nicht die Performancebremse, sondern die Festplatte selbst.
Wenn es wirklich ungewöhnlich langsam sein sollte, macht dein Programm womöglich irgendwelche Dummheiten, beispielsweise Dateien immer wieder öffnen und schließen.
-
also das programm schafft etwa 3MB/sek in die textdatei zu schreiben (vor jedem shreibvorgang werden alledings einige rechenoperationen ndurchgeführt).
ist das so normal oder sollte ich nach einer solchen "Dummheit" suchen die die performance total drückt?
-
Die fstreams sollten sogar schneller sein als ungepufferte Betriebssystemfunktionen.
Wie schreibst du denn in die Dateien? Du solltest auf jeden Fall die
write()Funktionen nutzen, nichtoperator<<!
-
aktuell schribe ich mit dem operator << in die datei;
aber warum soll ich den nicht benutzen? mach das solche performance-unterschiede aus?
edit: im moment mache ich das zB so:
wenn ich zB die zahlen von 1 bis 500 schreiben will[will ich natürlich nicht, ist aber als beispiel für meine schreibmethode gut geeignet]
//zahlen von 1-500 schreiben: ofstream file("C://test.txt"); for(int a=0;a<500;a++) { file<<a<<endl; } file.close();wie macht man es jetzt besser? habe die methode .write noch nie verwendet, ich werde sie mir aber mal in der doku anschauen...
-
Ein erster Ansatzpunkt wäre schonmal, std::endl durch "\n" zu ersetzen.
-
stimmt denn <<endl synchronisiert auch jedesmal wie ich herausgefunden habe^^
das habe ich jetzt auch ersetzt; aber wo liegt der Unterschied zwischn der .write() Methode und dem operator << und warum macht das solche performance-unterschiede aus?
-
std::endlzu entfernen ist wichtig, sonst flushed du jedes mal die Ausgabe.operator<<ist die formatierte Ausgabe. Ein Integer muss beispielsweise erstmal in einen String umgewandelt werden wenn man nicht binär in die Datei schreibt.write()dagegen schreibt einfach einen Block an Daten, welcher nicht irgendwie umgesetzt werden muss.Die Frage ist, wie die Daten denn genau in die Datei geschrieben werden sollen: Ascii oder binär.
-
andi01 schrieb:
das habe ich jetzt auch ersetzt; aber wo liegt der Unterschied zwischn der .write() Methode und dem operator << und warum macht das solche performance-unterschiede aus?
Der << operator kann ein bisschen mehr, d.h. er rechnet mehr. Falls das bei dir tatsächlich etwas an der tatsächlichen Schreibgeschwindigkeit ändern sollte (d.h. die CPU ist der Flaschenhals), dann empfehle ich dir, deinen C64 mal gegen einen etwas neueren Computer auszutauschen.
Ebenso die Verwendung von \n statt endl. Es ist zwar richtig, \n zu verwenden, wenn man wirklich nur einen Zeilenumbruch haben will anstatt den stream zu flushen, aber die Schreibperformance einer Festplatte sollte das eigentlich nicht beeinflussen. Denn hinter dem stream sollten eigeentlich noch diverse Schreibpuffer, sowohl auf Dateisystem als auch auf Hardwareebene kommen. Das endl macht bloß, dass die Daten an diese Puffer weitergegeben werden. Wieder gilt: Falls dies etwas ausmacht, sollte man seine 30 Jahre alte Computertechnik vielleicht mal gegen was neues austauschen.
Kannst du ein compilierbares Beispielprogramm geben, dass bei dir eine solch niedrige Performance hat? Ich vermute, dass du entweder irgendwelche Dummheiten machst oder dass der Flaschenhals woanders liegt (vielleicht sind deine Rechnungen so aufwändig, dass es nicht schneller geht).
-
da das mit dem kompilierbaren beispielprogramm etwas lang werden würde hier einfach einmal die genaue beschreibung was das programm tut:
(eigentlich eine art snapshot aller prozessvariablen)-zuerst beechnet es die Adressräume meines Programmes im Arbeitsspeicher
-dann werden einfach sämtliche adressen inklusive den vorher mit ReadProcessMemory ermittelten werten über fstream in ein textdatei geschrieben.Ziel meiner Anwendung ist es, Änderungen an den eigenen Variablen mitzubekommen indem die aktullen werte mit denen zuvor in die textdatei geschriebenen werten verglichen werden. das einzige problem dabei ist wirklich die performance, da so ein prozess natürlich unglablich viele variablen hat und damit schon die kleinsten performancebremsen große Auswirkungen haben...
gibt es vielleicht eine effektivere methode um eine art snapshot aller variablenwerte zu erstellen?
wie gesagt eigentlich geht es nur darum sämtliche änderungen an allen prozessvariablen mitzubekommen, die methode ist dabei eigentlich egal...edit: ich habe ja ganz die systemspezifikationen vergessen xD:
-MS Visual C++ 2008 EE
-Win XP SP2
-und nein, der pc ist keine 30 jahre alt sonden 2
-
stell mal auf release mode...
-
dann kommen einige fehlermeldungen "nicht aufgelöste externe verweise" weil ich meine funktionen aus einer dll importiere, im debugmode geht alles...
aber gibt es vielleicht eine effektivere mehode änderungen von variablen im haupspeicher mizubekommen?
-
Ja Release-Mode wäre schon mal sinnvoll. Du musst die Projekteinstellungen (Laden von DLLs und Libs etc.) einfach noch mal für Release einstellen. Dann könnte noch etwas Performance rauskommen.