istream, eine zeile zurück springen[gelöst]
-
Vorschlag zur Güte: Implementier´ beides und miss was schneller ist. Kannst deine Ergebnisse ja anschließend hier mitteilen.
-
Ich verstehe das so, dass beim tauschen der zusätzliche aufwand pro zeile zwei adress/zeiger vertauschungen ist und absolut ein String an speicher mehr gebraucht wird,
Soweit richtig, der zusätzliche Speicherverbrauch ist aber irrelevant...
Bei zwischenspeichern ist der Absolute aufwand gleich aber bei jeder zeile muss eine komplette Copiraktion des inhaltes durchgeführt werden?
Vertauschen=Zwischenspeichern bei krümelkackers Variante.
... wie dem auch sei, wenn du tatsächlich nur ein einziges Mal in Verlauf des ganzen Einlesevorgangs zurückspringen musst, dann ist das schon ab nur 7.000 Zeilen die bessere Lösung. Eine Ausnahme liegt vor, wenn Seeking bei der Datei nicht möglich ist.
-
Athar schrieb:
... wie dem auch sei, wenn du tatsächlich nur ein einziges Mal in Verlauf des ganzen Einlesevorgangs zurückspringen musst, dann ist das schon ab nur 7.000 Zeilen die bessere Lösung. Eine Ausnahme liegt vor, wenn Seeking bei der Datei nicht möglich ist.
Da wäre ich mir nicht so sicher, vermutlich dauert beides ungefähr gleich lang, die Rückspringvariante jedoch ein paar Takte länger.
Bedenke, dass Ein-/Ausgabe mit Abstand das langsamste ist, was im Computer abläuft. Die Stringoperation ist jedoch extrem schnell. Vermutlich wird das Programm die meiste Zeit auf die Datei warten. Ob es während des Wartens noch 20 Takte für Stringvertauschung benutzt macht die Dateioperation nicht schneller oder langsamer. Der einmalige Rücksprung wird natürlich Zeit kosten, aber einmal Springen bei zigtausenden Zeilen dürfte insgesamt nicht viel ausmachen.
Das wäre natürlich anders, wenn die Daten schon im Speicher lägen, also beispielsweise wenn aus einem Stringstream gelesen würde.
P.S.: @Threadersteller: Eine 20 MB Datei und du machst dir Sorgen um die Lesegeschwindigkeit? Programmierst du für C64?
-
Rustyspoon schrieb:
Desshalb ist es für mich schwer vorstellbar, dass es günstiger ist 2,5mio mal zu tauschen/speichern.
Das gute beim Computer ist, dass man sich solche Sachen nicht vorstellen muss, sondern es einfach ausprobieren kann. Die Zeit, die du hier mit herumkritteln an einer funktionierenden Lösung aus abergläubischen Gründen verplemperst, könntest du besser genutzt haben.
-
SeppJ schrieb:
P.S.: @Threadersteller: Eine 20 MB Datei und du machst dir Sorgen um die Lesegeschwindigkeit? Programmierst du für C64?
wie ich sagte, die könne auch größer sein. außerdem interessiert es mich auch einfach so allgemein.
btw.
swapen und ueberschreiben spart tatsächlich etwas zeit. wie das mit dem zurückspringen geht habe ich noch nicht verstanden.
-
Ich ging von allen Betrachtungen davon aus, dass sich die Datei ohnehin schon vollständig im Filecache befindet. Muss zwar nicht der Fall sein, aber:
SeppJ schrieb:
Der einmalige Rücksprung wird natürlich Zeit kosten, aber einmal Springen bei zigtausenden Zeilen dürfte insgesamt nicht viel ausmachen.
Eben.
Moment mal: bei der Zurückspringvariante muss man sich beim Einlesen einer neuen Zeile die Position der alten merken - das tellg() kostet auch wieder mehrere tausend Zyklen pro Zeile.
Gut, dann unterm Strich:
Vergiss das mit dem Zurückspringen einfach.
Letzte Zeile merken ist in allen Lebenslagen besser.
-
Athar schrieb:
Ich ging von allen Betrachtungen davon aus, dass sich die Datei ohnehin schon vollständig im Filecache befindet. Muss zwar nicht der Fall sein, aber:
SeppJ schrieb:
Der einmalige Rücksprung wird natürlich Zeit kosten, aber einmal Springen bei zigtausenden Zeilen dürfte insgesamt nicht viel ausmachen.
Eben.
Moment mal: bei der Zurückspringvariante muss man sich beim Einlesen einer neuen Zeile die Position der alten merken - das tellg() kostet auch wieder mehrere tausend Zyklen pro Zeile.
Gut, dann unterm Strich:
Vergiss das mit dem Zurückspringen einfach.
Letzte Zeile merken ist in allen Lebenslagen besser.selbst wenn es für das ausrechnen der stelle und für das springen, zweimal mehrere tausen sind ist das unterm strich n absoluter wert und die nadere variante ist lineare und wird somit iwann durch die erste übertrumpft.
-
Rustyspoon schrieb:
selbst wenn es für das ausrechnen der stelle und für das springen, zweimal mehrere tausen sind ist das unterm strich n absoluter wert und die nadere variante ist lineare und wird somit iwann durch die erste übertrumpft.
Die andere Variante ist nicht unbedingt linear. Vermutlich kostet sie sogar 0. Du bist höchstwahrscheinlich sowieso am Warten auf die IO. Ob du währenddessen Strings verschiebst, ist völlig Wumpe, davon wird die Festplatte auch nicht schneller oder langsamer. Denke daran, dass die IO durchaus parallel im Hintergrund arbeitet, egal was dein Programm gerade macht.
Deshalb ist es auch durchaus eine gute Idee, immer alle schon machbaren Arbeitsschritte während des Einlesens einer Datei zu erledigen, anstatt erst alles zu lesen und dann zu rechnen.
-
[quote="Rustyspoon
selbst wenn es für das ausrechnen der stelle und für das springen, zweimal mehrere tausen sind ist das unterm strich n absoluter wert[/quote]Wieso absolut ? Du musst du dir doch die Position für jede neue Zeile erneut merken. Du musst nur einmal springen, das ist absolut, aber das merken der Anfangsposition der letzten Zeile variiert doch genauso je nach größe der Datei.
-
SeppJ schrieb:
Rustyspoon schrieb:
selbst wenn es für das ausrechnen der stelle und für das springen, zweimal mehrere tausen sind ist das unterm strich n absoluter wert und die nadere variante ist lineare und wird somit iwann durch die erste übertrumpft.
Die andere Variante ist nicht unbedingt linear. Vermutlich kostet sie sogar 0. Du bist höchstwahrscheinlich sowieso am Warten auf die IO. Ob du währenddessen Strings verschiebst, ist völlig Wumpe, davon wird die Festplatte auch nicht schneller oder langsamer. Denke daran, dass die IO durchaus parallel im Hintergrund arbeitet, egal was dein Programm gerade macht.
Deshalb ist es auch durchaus eine gute Idee, immer alle schon machbaren Arbeitsschritte während des Einlesens einer Datei zu erledigen, anstatt erst alles zu lesen und dann zu rechnen.
ah okay, danke für das hintergrund wissen

Rustyspoon schrieb:
selbst wenn es für das ausrechnen der stelle und für das springen, zweimal mehrere tausen sind ist das unterm strich n absoluter wert
Wieso absolut ? Du musst du dir doch die Position für jede neue Zeile erneut merken. Du musst nur einmal springen, das ist absolut, aber das merken der Anfangsposition der letzten Zeile variiert doch genauso je nach größe der Datei.
sorry aber das ist arg undeutlich formuliert. ich kann dir desshalb nicht genau sagen wo dein Denkfehler ist. es wird aber nur einmal absoluten rechenaufwand fürs zeilen springen und einmal absoluten rechenaufwand zum erechnen der "sprungweite" benötigt.
Gruß
-
SeppJ schrieb:
Deshalb ist es auch durchaus eine gute Idee, immer alle schon machbaren Arbeitsschritte während des Einlesens einer Datei zu erledigen, anstatt erst alles zu lesen und dann zu rechnen.
das kann man so nicht sagen.
-
Rustyspoon schrieb:
zum erechnen der "sprungweite"
Tja, und wie berechnest du die?
no_code schrieb:
das kann man so nicht sagen.
Doch.
-
Rustyspoon schrieb:
einmal absoluten rechenaufwand zum erechnen der "sprungweite" benötigt.
Und genau das ist für mich eigtl nicht wirklich absolut.
Wobei ich nicht weiß wie du das jetzt errechnen möchtest, vlt gibts da ja irgendeine geniale Möglichkeit mit der man aus dem Nichts die Weite errechnen kann...
-
Athar schrieb:
no_code schrieb:
das kann man so nicht sagen.
Doch.
Nein!
-
Doch!!!1
Im Ernst, bring doch Argumente, warum man das nicht sagen kann. Vielleicht willst du darauf hinaus, dass die Aussage nicht mehr passt, wenn zu viel zu berechnen ist. Wenn ich pro KB eine Minute lang rechne, sind die Puffer längst anderweitig im Gebraucht
Aber das steht nicht im Widerspruch zur Aussage und so kann man nur raten, was du meinst.
-
also um zwischendurch rumzurechnen muß man die datei stück für stück einlesen. da ist es ja nicht mit einem fread() getan. ich bin aber jetzt der meinung das es das schnellste ist die datei mit _einem_ fread() in den ram zu laden. da ich während dieses aufrufes nicht auf den buffer zugreifen darf/soll/kann ist das erledigen von machbaren aufgaben in der zwischenzeit auch nicht die schnellste möglichkeit soweit meine überlegung und daher...
nein

-
no_code schrieb:
also um zwischendurch rumzurechnen muß man die datei stück für stück einlesen. da ist es ja nicht mit einem fread() getan. ich bin aber jetzt der meinung das es das schnellste ist die datei mit _einem_ fread() in den ram zu laden. da ich während dieses aufrufes nicht auf den buffer zugreifen darf/soll/kann ist das erledigen von machbaren aufgaben in der zwischenzeit auch nicht die schnellste möglichkeit soweit meine überlegung und daher...
nein

Das stimmt aber nicht. Schonmal was von Cache, Pipelines, Prefetch & Co gehört?
-
von co schon dem rest nicht :p