Ecco un breve test di un semplice caso: un programma per leggere un elenco di numeri dall'input standard e XOR tutti i numeri.
versione 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;
}
versione 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;
}
risultati
Utilizzando un terzo programma, ho generato un file di testo contenente 33.280.276 numeri casuali. I tempi di esecuzione sono:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
La modifica delle impostazioni di ottimizzazione del compilatore non sembra aver cambiato molto i risultati.
Quindi: c'è davvero una differenza di velocità.
EDIT: User clyfish indica di seguito che la differenza di velocità è in gran parte dovuta alle funzioni Iostream di Iostream che mantengono la sincronizzazione con le funzioni CI / O. Possiamo disattivarlo con una chiamata a 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;
}
Nuovi risultati:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
Vince C ++ iostream! Si scopre che questa sincronizzazione interna / flushing è ciò che normalmente rallenta l'Iostream i / o. Se non stiamo mescolando stdio e iostream, possiamo disattivarlo, quindi iostream è il più veloce.
Il codice: https://gist.github.com/3845568