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