Come posso scoprire / controllare il livello di buffering interno in un flusso C ++?
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.
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 <=>.