Heim >Backend-Entwicklung >C++ >Warum ist „cin' von C beim Lesen von Zeilen aus stdin deutlich langsamer als Python?
Warum ist das Lesen von Zeilen aus stdin in C viel langsamer als in Python?
Hintergrund:
Das Lesen von String-Eingabezeilen aus stdin mit C kann deutlich langsamer sein als mit dem Python-Äquivalent. Diese Diskrepanz entsteht durch Standardeinstellungen in C, die mehr Systemaufrufe erfordern.
Standardverhalten von Eingabestreams:
Standardmäßig wird der C-Eingabestream cin mit synchronisiert die Standard-C-I/O-Bibliothek (stdio). Durch diese Synchronisierung wird sichergestellt, dass die Eingabe nicht zwischengespeichert und zeichenweise gelesen wird. Während dieses Verhalten Konflikte zwischen dem Cin-Stream und den stdio-Funktionen verhindert, führt es auch zu einer Leistungseinbuße.
Verwendung von Systemaufrufen:
Wenn cin mit stdio synchronisiert wird, Jedes gelesene Zeichen löst einen Systemaufruf aus, eine kostspielige Operation. Dieser Overhead verlangsamt den Eingabevorgang erheblich, insbesondere beim Lesen großer Datenmengen.
Lösung:
Um die Leistung des Zeilenlesens in C zu verbessern, kann man es deaktivieren die Synchronisation zwischen cin und stdio. Dies kann durch Aufrufen der Methode sync_with_stdio(false) erreicht werden.
Alternativ wird durch die Verwendung der fgets-Funktion anstelle von getline auch der Synchronisierungsaufwand umgangen.
Leistungsvergleich:
Hier ist ein Leistungsvergleich zwischen der ursprünglichen (synchronisierten) C-Implementierung und verschiedenen Ansätze:
Implementation | Lines per Second |
---|---|
Python (default) | 3,571,428 |
cin (default/naive) | 819,672 |
cin (no sync) | 12,500,000 |
fgets | 14,285,714 |
wc (not a fair comparison) | 54,644,808 |
Fazit:
Das Deaktivieren der Synchronisierung zwischen cin und stdio oder die Verwendung von fgets kann die Leistung des Zeilenlesens in C erheblich verbessern und es damit vergleichbar machen Pythons Effizienz.
Das obige ist der detaillierte Inhalt vonWarum ist „cin' von C beim Lesen von Zeilen aus stdin deutlich langsamer als Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!