Oto szybki test prostego przypadku: program do odczytywania listy liczb ze standardowego wejścia i XOR wszystkich liczb.
Wersja iostream:
#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;
}
wersja scanf:
#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;
}
Wyniki
Korzystając z trzeciego programu, wygenerowałem plik tekstowy zawierający 33 280 276 liczb losowych. Czasy realizacji to:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Zmiana ustawień optymalizacji kompilatora w ogóle nie zmieniła wyników.
Zatem: naprawdę istnieje różnica prędkości.
EDYCJA: Użytkownik clyfish wskazuje poniżej, że różnica prędkości jest w dużej mierze spowodowana funkcjami I / O iostream utrzymującymi synchronizację z funkcjami CI / O. Możemy to wyłączyć, dzwoniąc do 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;
}
Nowe wyniki:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostream wygrywa! Okazuje się, że ta wewnętrzna synchronizacja / opróżnianie jest tym, co zwykle spowalnia iostream we / wy. Jeśli nie mieszamy stdio i iostream, możemy to wyłączyć, a wtedy iostream jest najszybszy.
Kod: https://gist.github.com/3845568