Wie es ist, gibt es viele Ansätze zum Lesen einer Datei in eine Zeichenfolge.Warum liest ifstream :: viel schneller als Iteratoren?
Mit ifstream lesen :::
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());
Mit std :: copy_n: direkt in einen String und mit steambuf_iterators zusammen mit std :: copy_n zu lesen Zwei gewöhnlichsten verwenden ifstream :: read
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();
Viele Benchmarks zeigen, dass der erste Ansatz ist viel schneller als die zweite (in meinem Rechner g ++ verwenden - 4.9 ist etwa 10-mal schneller mit beiden -O2 und O3 Flaggen) und ich habe mich gefragt, was sein kann, der Grund für diesen Unterschied in der Leistung.
Ich vermute, der Iterator liest ein Zeichen nach dem anderen. Das würde den Unterschied erklären. –
@RSahu: Genauer gesagt verwendet der Iterator für jedes Byte 1+ virtuelle Aufrufe, während "read" 1-2 virtuelle Aufrufe pro Puffer sind. –
Side Kommentar: Sie können auch die Zeichenfolge an Ort und Stelle wie 'std :: string contents (std :: streambuf_iterator (in), {});', keine Notwendigkeit für 'copy_n' und bekommen die Größe der Datei. Aber wahrscheinlich wird es keinen großen Unterschied in Bezug auf die Geschwindigkeit machen. –
vsoftco