Warum ist istream/ostream langsam
50:40 von http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly Andrei Alexandrescu macht einen Witz darüber, wie Sie nicht effizient/langsam istream ist.
Hatte ich ein Problem in der Vergangenheit mit ostream langsam und fwrite deutlich schneller (Reduzierung viele Sekunden beim ausführen der main-Schleife einmal), aber ich habe nie verstanden, warum noch geprüft.
Was macht istream und ostream langsam in C++? oder zumindest langsam im Vergleich zu anderen Dingen (wie fread/fget, fwrite), die auch befriedigt die Bedürfnisse.
- IIRC die C++ - streams zu synchronisieren mit der "C i/o "- Konstrukte" wenn Sie (aus Gründen der Kompatibilität). Ich glaube, man kann Sie schneller drehen, das die Synchronisierung deaktiviert ("gewährt", müssen Sie davon abzuhalten, Dinge zu tun, wie printf danach)
- Was C "Konstrukte" würden ostream synchronisieren (es wurde eine Datei-Ausgabe-stream nicht std::out) und warum ist es langsamer als C fwrite?
- Werfen Sie einen Blick auf diese Antwort: stackoverflow.com/a/9371717/583833
- Das ist definitiv beantwortet die Frage cin. +1
- Verwandte: stackoverflow.com/questions/4340396/...
- möglich, Duplikat der Warum ist das Lesen der Zeilen von stdin viel langsamer in C++ über Python?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich IOStreams müssen nicht langsam sein! Es ist eine Frage der Umsetzung Sie in einem angemessenen Weg, um Sie schnell. Die meisten standard-C++ - Bibliothek scheinen nicht zu viel Aufmerksamkeit zu implementieren IOStreams. Vor langer Zeit, als mein CXXRT war noch eingehalten, es war in etwa so schnell wie stdio - wenn es richtig eingesetzt wird!
Beachten Sie, dass es einige performance-fallen für Benutzer ausgelegt, die mit IOStreams, jedoch. Die folgenden Richtlinien gelten für alle IOStream-Implementierungen, aber vor allem für diejenigen, die sind auf schnell sein:
std::cin
,std::cout
usw. müssen Sie rufen Siestd::sync_with_stdio(false)
! Ohne diesen Aufruf, jegliche Nutzung der standard-stream-Objekte ist erforderlich, um die Synchronisierung mit C standard-streams. Natürlich, bei der Verwendung vonstd::sync_with_stdio(false)
es wird davon ausgegangen, dass Sie nicht mischenstd::cin
mitstdin
,std::cout
mitstdout
usw.std::endl
, wie es Mandate viele unnötige Leerungen Puffer. Ebenfalls nicht festgelegtstd::ios_base::unitbuf
oder verwenden Siestd::flush
unnötig.virtual
Funktion macht es schrecklich langsam.Vielleicht dies kann Ihnen eine Vorstellung davon, was Sie zu tun haben:
Läuft, bekomme ich Ergebnisse wie dieses (mit MS-VC++):
und diese (mit MinGW):
Wie wir sehen in den Ergebnissen, es ist nicht wirklich eine Angelegenheit von iostreams wird kategorisch langsam. Eher, viel genau hängt davon ab, wie Sie verwenden iostreams (und in geringerem Maße
FILE *
auch). Es gibt auch eine ziemlich beträchtliche Unterschiede zwischen diesen zu-Implementierungen.Dennoch, den schnellsten Versionen, die mit jeder (
fread
undistream::read
) sind im wesentlichen gebunden. Mit VC++getc
ist ein bisschen langsamer als die beidenistream::read
oder undistreambuf_iterator
.Fazit: gute Leistung von iostreams erfordert ein wenig mehr Pflege als mit
FILE *
-- aber es ist sicherlich möglich. Sie geben Ihnen auch mehr Optionen: Komfort, wenn Sie don ' T care so viel über die Geschwindigkeit und Leistung, die direkt im Wettbewerb mit das beste, was Sie können erhalten von C-style-I/O, mit ein wenig zusätzliche Arbeit.istream::read
-version hat einen bug. Das Letzte Stück der Zeichen nicht markiert, siehe hier.Während diese Frage ist ziemlich alt, ich bin überrascht, niemand hat erwähnt iostream-Objekt-Konstruktion.
Ist, dass, wenn Sie erstellen eine STL -
iostream
(und anderen stream-Varianten), wenn Sie Schritt in den code, der Konstruktor ruft eine interneInit
Funktion. Dortoperator new
wird aufgerufen, um eine neue zu erstellenlocale
Objekt.Und ebenso ist zerstört, auf Zerstörung.
Dies ist hässlich, IMHO. Und trägt sicherlich zu langsam-Objekt-Konstruktion/Zerstörung, da Speicher reserviert/freigegeben, mit einem system sperren, irgendwann.
Weiter, einige der STL-streams können Sie angeben, eine
allocator
, also warum ist dielocale
erstellt, NICHT über die angegebene Zuweisung?Mithilfe von streams in einer Multithread-Umgebung, Sie könnte sich auch vorstellen, den Engpass auferlegt durch den Aufruf
operator new
jedes mal, wenn ein neues stream-Objekt konstruiert wird.Grässliches Chaos, wenn du mich fragst, wie ich finde mich jetzt!
Auf ein ähnliches Thema, STL, sagt: "Sie können anrufen setvbuf() aktiviert die Pufferung auf stdout."
https://web.archive.org/web/20170329163751/https://connect.microsoft.com/VisualStudio/feedback/details/642876/std-wcout-is-ten-times-slower-than-wprintf-performance-bug-in-c-library