istream, eine zeile zurück springen[gelöst]



  • 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.


  • Mod

    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 😉


  • Mod

    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


Anmelden zum Antworten