Inhaltsverzeichnis
Warum ist das Lesen von Zeilen aus stdin in C deutlich langsamer als in Python?
Der C-Code
Standardeinstellungen von C-Streams
Leistungsverbesserungen
Alternative: Verwendung von fgets
Benchmark-Ergebnisse
Schlussfolgerung
Heim Backend-Entwicklung Python-Tutorial 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 der „stdin'-Zeile von C deutlich langsamer als das von Python und wie kann es verbessert werden?

Nov 25, 2024 am 03:17 AM

Why Is C  's `stdin` Line Reading Significantly Slower Than Python's, and How Can It Be Improved?

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++;
}
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Apr 02, 2025 am 07:15 AM

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

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Apr 02, 2025 am 07:18 AM

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 ...

Wie bekomme ich Nachrichtendaten, die den Anti-Crawler-Mechanismus von Investing.com umgehen? Wie bekomme ich Nachrichtendaten, die den Anti-Crawler-Mechanismus von Investing.com umgehen? Apr 02, 2025 am 07:03 AM

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 ...

Python 3.6 Laden Sie Giftedatei Fehler ModulenotFoundError: Was soll ich tun, wenn ich die Gurkendatei '__builtin__' lade? Python 3.6 Laden Sie Giftedatei Fehler ModulenotFoundError: Was soll ich tun, wenn ich die Gurkendatei '__builtin__' lade? Apr 02, 2025 am 06:27 AM

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

Was ist der Grund, warum Pipeline -Dateien bei der Verwendung von Scapy Crawler nicht geschrieben werden können? Was ist der Grund, warum Pipeline -Dateien bei der Verwendung von Scapy Crawler nicht geschrieben werden können? Apr 02, 2025 am 06:45 AM

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 ...

See all articles