fifo buffer - deque oder vector?



  • deque<char> ist overkill.
    vector<char> als ringpuffer ist da sicher besser.



  • Gelesen wird wohl aus dem Buffer immer in Blöcken von 49152 Bytes, falls soviel noch im Buffer ist.

    Der Consumer ist hier eine andere Library, die ich hier über eine Schnittstelle erweitere.
    Lesen kann ich eigentlich aus der Datei so viel ich will, bisher ist die blockgröße 131072.

    Der Ringbuffer, das wäre in der tat interessant, könnte ich mir viel sparen.
    Würde das Löschen überflüssig machen und vector wäre dann optimal ausgenutzt.



  • Dann kannst du vermutlich auch gleiche eine deque<> mit 49152 Byte grossen Elementen machen, da wird ein Rinpuffer nichtmehr SO wahnsinnig viel schneller sein.
    Ich dachte du willst einzelne Bytes in eine deque<char> reintun/rausnehmen.



  • Also bei dem Ringbuffer, solange man da einen fixed buffer nimmt, spricht eigentlich alles für ein normales array, vector bietet da keine Vorteile, oder?
    Auch würde der Buffer ja dann auf dem Stack angelegt werden.



  • Das vector-Objekt wuerde auf dem Stack liegen aber vector speichert seine Daten intern auf dem Heap.
    Natuerlich koenntest du ein normales Array auf den Stack legen, kommt halt drauf an wie gross dein Puffer sein muss. Afair ist die Stackgroesse in Win32 standardmaessig 12MB, wenn du also nen 5MB Puffer brauchst kannst du davon maximal 2 haben.



  • By default ist die Stackgröße pro Thread 1 MB.



  • FrEEzE2046 schrieb:

    By default ist die Stackgröße pro Thread 1 MB.

    Stimmt, aber ich brauche sowieso nur 500kb höchstens, wird ja nie mehr als 49kb gelesen.
    Allerdings, wie ist der Geschwindigkeitsunterschied zum heap?
    Nutze memcpy fürs kopieren und lese mit std::istream::read direkt in den buffer.*
    Ein größerer Buffer bräuchte ja weniger reads aus dem Source.

    * Das erspart mir gegenüber Deque schon mal einige Kopien.



  • deque schrieb:

    FrEEzE2046 schrieb:

    By default ist die Stackgröße pro Thread 1 MB.

    Stimmt, aber ich brauche sowieso nur 500kb höchstens, wird ja nie mehr als 49kb gelesen.
    Allerdings, wie ist der Geschwindigkeitsunterschied zum heap?
    Nutze memcpy fürs kopieren und lese mit std::istream::read direkt in den buffer.*
    Ein größerer Buffer bräuchte ja weniger reads aus dem Source.

    * Das erspart mir gegenüber Deque schon mal einige Kopien.

    Die groesse des Puffers haengt davon ab wie schnelle dein Verbraucher im Verhaeltnis zum Erzeuger ist.
    Eigentlich duerfte es zwischen Stack und Heap keinen Geschwindigkeitsunterschied geben.
    Koenntest du deinen Sachverhalt in ein paar Zeilen Pseudocode beschreiben? (Verbraucher und Erzeuger getrennt voneinander)



  • Zugriffszeit ist auf Stack und Heap identisch, jedoch ist der Speicher auf dem Stack deutlich schneller reserviert (wenn auch begrenzt).



  • stumpfi schrieb:

    deque schrieb:

    FrEEzE2046 schrieb:

    By default ist die Stackgröße pro Thread 1 MB.

    Stimmt, aber ich brauche sowieso nur 500kb höchstens, wird ja nie mehr als 49kb gelesen.
    Allerdings, wie ist der Geschwindigkeitsunterschied zum heap?
    Nutze memcpy fürs kopieren und lese mit std::istream::read direkt in den buffer.*
    Ein größerer Buffer bräuchte ja weniger reads aus dem Source.

    * Das erspart mir gegenüber Deque schon mal einige Kopien.

    Die groesse des Puffers haengt davon ab wie schnelle dein Verbraucher im Verhaeltnis zum Erzeuger ist.
    Eigentlich duerfte es zwischen Stack und Heap keinen Geschwindigkeitsunterschied geben.
    Koenntest du deinen Sachverhalt in ein paar Zeilen Pseudocode beschreiben? (Verbraucher und Erzeuger getrennt voneinander)

    Pseudocode?
    Mein Verbraucher ruft eine Methode readBytes(uchar* to,size_t maxread) auf.
    Diese Methode liest aus dem Buffer, und der Producer schreibt dort hinein.
    maxread ist (fast) immer 49152. Die Quelldatei ist im 1-500mb bereich.
    Der Producer läuft in einem eigenen Thread, er soll wenn möglich den Buffer wieder auffüllen.

    Mir ist noch die Idee eines Flipbuffers gekommen, in dem es 2 buffer a und b gibt. Beide Buffer haben die Größe x, (1 mb z.b.).
    Anfangs werden beide gefüllt, wenn einer leer gelesen ist, wird der andere gelesen.
    In der Zeit wird der erste wieder aufgefüllt. So stelle ich sicher, das ich immer in einem festen Block aus der Datei lese, und nicht in vielen kleineren Reads (von z.b. 100kb).
    Bin noch am überlegen, ob dies wirklich sinnvoll wäre 🙂



  • deque schrieb:

    Allerdings, wie ist der Geschwindigkeitsunterschied zum heap?

    Dem Prozessor ist es egal ob du Speicher aus dem Heap oder Stack kopierst. Auf dem Stack liegen u.a. lokale Variablen und die übergebenen Parameter.

    Der Unterschied ist nur beim anlegen vorhanden. Wenn du statische Variablen benutzt, dann werden sie auf dem Stack bereitgestellt. Und das steht schon zur Kompilierzeit so fest.

    Wenn du dynamisch Speicher allokierst, dann nimmst du dir Speicher vom Heap und hast aufm Stack lediglich die Adressbreite mit dem dein OS arbeitet.


Anmelden zum Antworten