


Warum ist das Lesen der „stdin'-Zeile von C deutlich langsamer als das von Python und wie kann es verbessert werden?
Warum ist das Lesen von Zeilen aus stdin in C deutlich langsamer als in Python?
In diesem Artikel wollen wir untersuchen, warum das Lesen von Zeilen mit String-Daten aus der Standardeingabe (stdin ) mit C ist im Allgemeinen viel langsamer als sein Python-Gegenstück. Wir beginnen mit der Untersuchung des bereitgestellten Codes und identifizieren mögliche Problembereiche.
Der C-Code
string input_line; long line_count = 0; time_t start = time(NULL); int sec; int lps; while (cin) { getline(cin, input_line); if (!cin.eof()) line_count++; }
Dieser Code verwendet getline(), um Textzeilen zu lesen stdin und zählt die Anzahl der Zeilen in einer Datei. Es liest jedoch jedes Zeichen der Datei einzeln innerhalb einer inneren Schleife. Dieser Ansatz ist ineffizient und führt zu übermäßigen Systemaufrufen, was zu einer langsamen Ausführung führt.
Standardeinstellungen von C-Streams
Im Gegensatz zu Python verfügen C-Streams über Standardeinstellungen, die die Synchronisierung mit dem C-Stil-Standard priorisieren Eingabe- und Ausgabefunktionen. Durch diese Synchronisierung wird sichergestellt, dass sowohl C- als auch C-Streams konsistent auf Eingabe- und Ausgaberessourcen zugreifen. Diese Synchronisierung verhindert jedoch auch, dass C-Streams effizientere Puffermechanismen verwenden.
cin wird mit stdio synchronisiert, wodurch jegliche Eingabepufferung vermieden wird. Infolgedessen liest cin jeweils nur ein Zeichen, was den Vorgang zeitaufwändiger macht.
Leistungsverbesserungen
Um die Leistung des C-Codes zu verbessern, Wir können die Synchronisierung zwischen cin und stdio deaktivieren. Durch das Hinzufügen der Anweisung cin.sync_with_stdio(false) am Anfang des Programms können wir C-Streams ermöglichen, ihre E/A unabhängig zu puffern, was zu erheblichen Geschwindigkeitssteigerungen führt.
Alternative: Verwendung von fgets
Ein weiterer effektiver Ansatz zur Leistungssteigerung ist die Verwendung von fgets() anstelle von getline(). fgets ist eine C-Funktion, die eine bestimmte Anzahl von Zeichen aus stdin in ein Zeichenarray liest und so eine bessere Kontrolle über den Pufferungsprozess bietet.
Benchmark-Ergebnisse
Zur Demonstration der Aufgrund des Leistungsunterschieds wurde zum Benchmarking eine Datei mit 100 Millionen Zeilen verwendet. Die Ergebnisse unter Verwendung des ursprünglichen (synchronisierten) C-Codes, C mit deaktivierter Synchronisierung und Python waren wie folgt:
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 |
Das Deaktivieren der Synchronisierung in C führte zu einer deutlichen Verbesserung, während die Verwendung von fgets eine noch bessere Leistung bot. Es ist wichtig zu beachten, dass die Verwendung von wc kein fairer Vergleich ist, da es speziell zum Zählen von Zeilen entwickelt wurde.
Schlussfolgerung
Durch Verständnis der Standardeinstellungen von C-Streams und Implementierung Durch entsprechende Optimierungen, wie das Deaktivieren der Stream-Synchronisierung oder die Verwendung von fgets, kann die Leistung von C-Code zum Lesen von Zeilen aus stdin erheblich verbessert werden, Damit ist es seinem Python-Gegenstück ebenbürtig oder sogar schneller.
Das obige ist der detaillierte Inhalt vonWarum ist das Lesen der „stdin'-Zeile von C deutlich langsamer als das von Python und wie kann es verbessert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Fastapi ...

Verwenden Sie Python im Linux -Terminal ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Über Pythonasyncio ...

Verständnis der Anti-Crawling-Strategie von Investing.com Viele Menschen versuchen oft, Nachrichten von Investing.com (https://cn.investing.com/news/latest-news) zu kriechen ...

Laden Sie die Gurkendatei in Python 3.6 Umgebungsfehler: ModulenotFoundError: Nomodulenamed ...

Diskussion über die Gründe, warum Pipeline -Dateien beim Lernen und Verwendung von Scapy -Crawlern für anhaltende Datenspeicher nicht geschrieben werden können, können Sie auf Pipeline -Dateien begegnen ...
