Aqui está um teste rápido de um caso simples: um programa para ler uma lista de números da entrada padrão e XOR todos os números.
versão 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;
}
versão 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 um terceiro programa, eu gerei um arquivo de texto contendo 33.280.276 números aleatórios. Os tempos de execução são:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Alterar as configurações de otimização do compilador não pareceu alterar muito os resultados.
Assim: realmente existe uma diferença de velocidade.
EDIT: O usuário clyfish indica abaixo que a diferença de velocidade se deve em grande parte às funções de E / S iostream, que mantêm a sincronização com as funções de CI / O. Podemos desativar isso com uma chamada para 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;
}
Novos resultados:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostream vence! Acontece que essa sincronização / liberação interna é o que normalmente reduz a velocidade de E / S do iostream. Se não estivermos misturando stdio e iostream, podemos desativá-lo e o iostream é o mais rápido.
O código: https://gist.github.com/3845568