Così com'è, ci sono molti approcci per leggere un file in una stringa. due più comuni stanno usando ifstream :: Leggi per leggere direttamente in una stringa e utilizzando steambuf_iterators con std :: copy_n:Perché ifstream :: legge molto più velocemente rispetto all'utilizzo degli iteratori?
Utilizzando ifstream :: leggere:
std::ifstream in {"./filename.txt"};
std::string contents;
in.seekg(0, in.end);
contents.resize(in.tellg());
in.seekg(0, in.beg);
in.read(&contents[0], contents.size());
Utilizzando std :: copy_n:
std::ifstream in {"./filename.txt"};
std::string contents;
in.seekg(0, in.end);
contents.resize(in.tellg());
in.seekg(0, in.beg);
std::copy_n(std::streambuf_iterator<char>(in),
contents.size(),
contents.begin();
Molti benchmark mostrano che il primo approccio è molto più veloce rispetto alla seconda (nella mia macchina con g ++ - 4.9 è di circa 10 volte più veloce con entrambe le -O2 e -O3 bandiere) e mi chiedevo che cosa può essere il motivo di questa differenza di prestazioni.
Sospetto che l'iteratore legge un carattere alla volta. Questo spiegherebbe la differenza. –
@RSahu: in particolare, l'iteratore utilizza 1+ chiamate virtuali per ogni byte, mentre 'read' è 1-2 chiamate virtuali per buffer. –
commento laterale: puoi anche costruire la stringa in posizione come 'std :: string contents (std :: streambuf_iterator (in), {});', non c'è bisogno di 'copy_n' e ottenere la dimensione del file. Ma probabilmente non farà una grande differenza in termini di velocità. –
vsoftco