Hier ist ein kurzer Test eines einfachen Falls: Ein Programm zum Lesen einer Liste von Zahlen aus der Standardeingabe und XOR aller Zahlen.
iostream-Version:
#include <iostream>
int main(int argc, char **argv) {
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 argc, char **argv) {
int parity = 0;
int x;
while (1 == scanf("%d", &x))
parity ^= x;
printf("%d\n", parity);
return 0;
}
Ergebnisse
Mit einem dritten Programm habe ich eine Textdatei mit 33.280.276 Zufallszahlen erstellt. Die Ausführungszeiten sind:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Das Ändern der Optimierungseinstellungen des Compilers schien die Ergebnisse überhaupt nicht zu ändern.
Also: Es gibt wirklich einen Geschwindigkeitsunterschied.
BEARBEITEN : User Clyfish weist unten darauf hin, dass der Geschwindigkeitsunterschied hauptsächlich auf die Iostream-E / A-Funktionen zurückzuführen ist, die die Synchronisation mit den CI / O-Funktionen aufrechterhalten. Wir können dies mit einem Anruf ausschalten std::ios::sync_with_stdio(false);
:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
std::ios::sync_with_stdio(false);
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
Neue Ergebnisse:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostream gewinnt! Es stellt sich heraus, dass diese interne Synchronisierung / Spülung normalerweise die Iostream-E / A verlangsamt. Wenn wir nicht stdio und iostream mischen, können wir es ausschalten, und dann ist iostream am schnellsten.
Der Code: https://gist.github.com/3845568