Voici un test rapide d'un cas simple : un programme qui lit une liste de nombres à partir de l'entrée standard et effectue un XOR de tous les nombres.
version 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;
}
version 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;
}
Résultats
En utilisant un troisième programme, j'ai généré un fichier texte contenant 33 280 276 nombres aléatoires. Les temps d'exécution sont :
iostream version: 24.3 seconds
scanf version: 6.4 seconds
La modification des paramètres d'optimisation du compilateur n'a pas semblé modifier les résultats de façon significative.
Donc : il y a vraiment une différence de vitesse.
EDITAR: Utilisateur clyfish souligne ci-dessous que la différence de vitesse est largement due au fait que les fonctions d'E/S d'iostream maintiennent la synchronisation avec les fonctions d'E/S du C. Nous pouvons désactiver cette synchronisation par un appel à 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;
}
Nouveaux résultats :
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C++ iostream gagne ! Il s'avère que cette synchronisation/balayage interne est ce qui ralentit normalement les entrées/sorties de iostream. Si nous ne mélangeons pas stdio et iostream, nous pouvons le désactiver, et iostream est alors plus rapide.
Le code : https://gist.github.com/3845568
0 votes
Je suis curieux de savoir quel genre de problèmes ils ont pour lesquels ils pensent que ce sera un problème. Vous avez un lien vers ce site ?
0 votes
@Eclipse : voici le lien vers le site : spoj.pl La citation ci-dessus a été trouvée quelque part sur les forums.
17 votes
A mon avis, un mauvais programmeur accuse les bibliothèques standard d'être responsables des mauvaises performances. Un peu comme le cri toujours humoristique "Je pense avoir trouvé un bug dans GCC".
12 votes
@eclipse : les problèmes ACM sur lesquels j'ai travaillé pour des compétitions ont une quantité substantielle d'entrée/sortie et votre programme doit résoudre les questions en moins de quelque chose comme 60 secondes... cela devient un vrai problème ici.
23 votes
--- cela dit, si vous devez compter sur scanf() pour obtenir ce gain de performance supplémentaire, vous vous trompez de méthode :)
0 votes
C'est une chose amusante à propos de cin (faites défiler jusqu'au moment où il parle de son ralentissement dans son impl) : unthought.net/c++/c_vs_c++.html
4 votes
Juste à titre d'observation - j'ai joué avec, et sur le 2ème problème (PRIME1) - en utilisant le même algorithme, les deux fois, une fois en utilisant cin/cout et une fois avec scanf/printf et la première version était plus rapide que la seconde (mais suffisamment proche pour que ce ne soit pas statistiquement pertinent). La première version était plus rapide que la seconde (mais suffisamment proche pour ne pas avoir d'incidence statistique). Il s'agit d'un des problèmes marqués comme étant intensifs en entrée/sortie, et la méthode d'entrée/sortie ne fait aucune différence statistique.
5 votes
@Eclipse - merci pour l'information concernant le test des deux méthodes. Je suis triste cependant - j'ai essayé de blâmer cin et cout, mais maintenant je sais que mon algorithme est nul :)