Aquí hay una prueba rápida de un caso simple: un programa para leer una lista de números de entrada estándar y XOR todos los números.
versión 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;
}
versión 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;
}
Resultados
Usando un tercer programa, generé un archivo de texto que contenía 33,280,276 números aleatorios. Los tiempos de ejecución son:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Cambiar la configuración de optimización del compilador no pareció cambiar mucho los resultados.
Por lo tanto: realmente hay una diferencia de velocidad.
EDITAR: El usuario clyfish señala a continuación que la diferencia de velocidad se debe en gran medida a que las funciones de E / S iostream mantienen la sincronización con las funciones de CI / O. Podemos desactivar esto con una llamada 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;
}
Nuevos resultados:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
¡C ++ iostream gana! Resulta que esta sincronización / descarga interna es lo que normalmente ralentiza la E / S de iostream. Si no estamos mezclando stdio e iostream, podemos desactivarlo y luego iostream es más rápido.
El código: https://gist.github.com/3845568