Scanf() in C verwenden: Ist es schneller als cin?
In C wird allgemein angenommen, dass cin und cout für die Eingabe verwendet werden und die Ausgabe ist deutlich langsamer als die Verwendung von printf und scanf. Dies beruht auf der Annahme, dass scanf() für C optimiert ist, während cin und cout mit langsameren Standard-I/O-Funktionen implementiert werden.
Benchmark-Ergebnisse
Um festzustellen, ob diese Behauptung zutrifft, wurde ein einfacher Benchmark mit einem Programm durchgeführt, das eine Liste von Zahlen aus der Standardeingabe liest und deren XOR berechnet. Das Programm wurde sowohl mit der iostream- als auch der scanf-Version implementiert:
iostream-Version:
#include <iostream> int main() { int parity = 0; int x; while (std::cin >> x) parity ^= x; std::cout << parity << std::endl; return 0; }
scanf-Version:
#include <stdio.h> int main() { int parity = 0; int x; while (1 == scanf("%d", &x)) parity ^= x; printf("%d\n", parity); return 0; }
Beim Test mit einem großen Datensatz von über 33 Millionen Zufallszahlen wurde die Scanf-Version in 6,4 Sekunden abgeschlossen, während die Die iostream-Version dauerte enttäuschende 24,3 Sekunden.
Auswirkungen auf die Optimierung
Compiler-Optimierungseinstellungen hatten keinen wesentlichen Einfluss auf die Ergebnisse. Dies deutet darauf hin, dass der Geschwindigkeitsunterschied hauptsächlich auf inhärente Unterschiede in der Implementierung von scanf() und cin/cout zurückzuführen ist.
Der Übeltäter: std::ios::sync_with_stdio
Weitere Untersuchungen ergaben, dass die Iostream-I/O-Funktionen die Synchronisierung mit den C-I/O-Funktionen aufrechterhalten. Standardmäßig beinhaltet diese Synchronisierung das Leeren des Ausgabepuffers nach jedem Eingabevorgang, was zu einer langsameren Leistung führt.
Synchronisierung deaktivieren
Glücklicherweise kann diese Synchronisierung durch den Aufruf von std deaktiviert werden ::ios::sync_with_stdio(false):
std::ios::sync_with_stdio(false);
Nach dem Deaktivieren der Synchronisierung wird die Leistung des Die iostream-Version hat sich dramatisch verbessert und ist in nur 5,5 Sekunden abgeschlossen.
C iostream gewinnt
Bei deaktivierter Synchronisierung wird C iostream zur schnelleren Option für diesen speziellen Benchmark. Es stellt sich heraus, dass die interne Synchronisierung von std::cout die Hauptursache für die langsamere Leistung von iostream ist.
Fazit
Während die Verwendung von scanf() in einigen Fällen schneller sein kann In einigen Fällen ermöglicht die Deaktivierung von std::ios::sync_with_stdio, dass iostream scanf in vielen Szenarien übertrifft, insbesondere wenn eine gemischte Verwendung von vermieden wird stdio- und iostream-Funktionen.
Das obige ist der detaillierte Inhalt vonIst „scanf()' in C für die Eingabe wirklich schneller als „cin'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!