Heim > Backend-Entwicklung > C++ > Ist „scanf()' in C für die Eingabe wirklich schneller als „cin'?

Ist „scanf()' in C für die Eingabe wirklich schneller als „cin'?

Linda Hamilton
Freigeben: 2024-11-23 10:38:11
Original
1020 Leute haben es durchsucht

Is `scanf()` in C   Really Faster Than `cin` for Input?

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

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

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 Login kopieren

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!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage