Come posso scoprire / controllare il livello di buffering interno in un flusso C ++?

StackOverflow https://stackoverflow.com/questions/351582

  •  20-08-2019
  •  | 
  •  

Domanda

Dire che lo faccio (un esempio inventato):

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream ifs(argv[1]);

    char ch;
    while(ifs.read(&ch, 1)) {
        cout << ch;
    }
}

Suppongo (spero) che la libreria iostream esegua alcuni buffering interni qui e non li trasformi in migliaia di operazioni di lettura di file a un byte a livello di sistema operativo.

C'è un modo di:

a) Stai scoprendo le dimensioni del buffer interno di ifstream?

b) Stai cambiando la dimensione del buffer interno di ifstream?

Sto scrivendo un filtro file che deve leggere file multi-gigabyte in piccoli blocchi e vorrei sperimentare dimensioni di buffer diverse per vedere se influisce sulle prestazioni.

È stato utile?

Soluzione

Puoi usare ios::rdbuf() per ottenere un puntatore a un streambuf oggetto. Questo oggetto rappresenta il buffer interno per il flusso.

Puoi chiamare streambuf::pubsetbuf(char * s, streamsize n) per impostare un nuovo buffer interno con una data dimensione.

Vedi questo link per maggiori dettagli.

modifica: Ecco come apparirebbe nel tuo caso:


#include <iostream>
#include <fstream>
using namespace std;

int main(int argCount, char ** argList[])
{
    ifstream inStream(argList[1]);

    char myBuffer [512];
    inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));

    char ch;
    while(inStream.read(&ch, 1))
    {
        cout << ch;
    }
}

modifica: come sottolineato da litb , il comportamento effettivo di streambuf::pubsetbuf è " implementazione definita quot &;.

Se vuoi davvero giocare con i buffer, potresti dover lanciare la tua classe di buffering che eredita da <=>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top