std::ofstream sehr langsam
-
Hallo.
Ich habe ein Programm, dass eine Datei einliest, sie bearbeitet und diese bearbeiteten Daten wieder in eine neue Datei schreibt. Das Einlesen klappt bei einer 1MB-Datei noch recht schnell (wenige Sekunden). Das Schreiben aber (per std::ofstream::write()) dauert allerdings sehr lange (bei der genannten 1MB-Datei ueber 20 Minuten), viel zu lange.
Zum Test habe ich das Schreiben in die Datei mal auskommentiert, um zu sehen, ob es vielleicht nicht an meiner Bearbeitungsroutine liegt, aber da habe ich mich getaeuscht. Ohne das Schreiben in die Datei braucht mein Programm fuer die ganze Prozedur wenige Sekunden.
Woran liegts denn?output.write(data.c_str(), data.size()*sizeof(char)); // data ist ein std::stringGruss
Cartman
-
Selbst für das Einlesen von 1 MB dürften "einige Sekunden" noch viel zu lang sein...
Aber auf jeden Fall sollte der Funktionsaufruf eher so aussehen:
output.write(data.c_str(), data.length ());
-
Einige Sekunden beim Lesen und beim Schreiben 20 Minuten von nur einem Megabyte? Was zur Hölle machst du?
Habe gerade versucht sowas zu messen. Ein neues File wird erstellt, 1 MB Daten werden reingeschrieben, File wird geschlossen. File wird geöffnet, 1 MB Daten werden gelesen, File wird geschlossen. File wird wieder geöffnet, 1 MB Daten werden überschrieben, File wird geschlossen. Dazwischen jeweils die Zeit gemessen. Resultat:
1: 0ms
2: 0ms
3: 0msIch habe mit einer Auflösung von 2ms gemessen. Die Operationen sind also unterhalb dieser 2ms passiert. Der Stream ist sicher nicht dein Problem, du machst anderswo eine riesige Sache, welche dein Programm bremst. Ein Profiler würde dir da helfen.
Ich frage mich allerdings was du da wohl machst. Meine persönliche XML Bibliothek braucht für das Lesen von 1 MB XML Daten gerade mal ca. 200ms. Und nach diesen 200ms habe ich ein vollwertiges XML Dokument. Das Schreiben dauert nur unwesentlich länger. Aber ganz sicher keine Sekunde und nie im Leben eine Minute oder noch mehr...Grüssli
-
Ja, war mein Fehler.. hatte eine zu langwierige Funktion fuer write() benutzt... Danke

Gruss
Cartman
-
Eric Cartman schrieb:
hatte eine zu langwierige Funktion fuer write() benutzt...
Hey, magste das mal erklären, irgendwie kann ich mir darunter rein gar nix vorstellen?
-
Badestrand schrieb:
Eric Cartman schrieb:
hatte eine zu langwierige Funktion fuer write() benutzt...
Hey, magste das mal erklären, irgendwie kann ich mir darunter rein gar nix vorstellen?
Gerne. Fuer den ersten Parameter von std::ofstream::write() habe ich eine Funktion benutzt, die einen std::string zurueckgibt (diesen dann natuerlich mit c_str() verknuepft). Diese Funktion enthielt einige Schleifen, die den Programmablauf deutlich verlangsamt haben... Konnte aber nun eine andere Loesung finden - jetzt schreibt es die 1MB-Datei in wenigen Sekunden.
Gruss
Cartman
-
Eric Cartman schrieb:
Konnte aber nun eine andere Loesung finden - jetzt schreibt es die 1MB-Datei in wenigen Sekunden.
Wenn "es" nebenbei nichts großartig anderes macht, dann ist "wenige Sekunden" immernoch zu viel, siehe Dravere's Post.
-
devkid schrieb:
Eric Cartman schrieb:
Konnte aber nun eine andere Loesung finden - jetzt schreibt es die 1MB-Datei in wenigen Sekunden.
Wenn "es" nebenbei nichts großartig anderes macht, dann ist "wenige Sekunden" immernoch zu viel, siehe Dravere's Post.
Nö, nicht wenn der PC so langsam ist. Woher weißt du, das er nicht vielleicht einen 486er hat?

-
Bulli schrieb:
devkid schrieb:
Eric Cartman schrieb:
Konnte aber nun eine andere Loesung finden - jetzt schreibt es die 1MB-Datei in wenigen Sekunden.
Wenn "es" nebenbei nichts großartig anderes macht, dann ist "wenige Sekunden" immernoch zu viel, siehe Dravere's Post.
Nö, nicht wenn der PC so langsam ist. Woher weißt du, das er nicht vielleicht einen 486er hat?

Den hab ich auch, benutze ihn aber nicht

@devkid
Nunja, schneller geht es wohl nicht mehr...Gruss
Cartman
-
Eric Cartman schrieb:
@devkid
Nunja, schneller geht es wohl nicht mehr...Sagt wer? Der Programmierer? Der kann solche Dinge meistens nur sehr schlecht beurteilen. Deshalb gibt es eben Profiler, welche die Codes zur Laufzeit analysieren und dem Programmierer Feedback geben, wo Zeit verbraten wird. 1 MB Daten sind wirklich nicht viel und sollten unterhalb von einer Sekunde mit fast egal welcher Formatierung geschrieben werden können.
Vielleicht könnten wir dir sogar helfen, falls es nicht zu viel Code ist. Also ich würde mich mit diesen Sekunden nicht zufrieden geben, vor allem nicht mit den heutigen Computern.
Grüssli
-
Dravere schrieb:
Sagt wer? Der Programmierer?
