Maison > Article > développement back-end > `scanf()` est-il vraiment plus rapide que `cin` en C, et comment pouvons-nous optimiser les performances de `cin`\ ?
L'utilisation de scanf() dans les programmes C est-elle plus rapide que cin ?
L'affirmation selon laquelle l'utilisation de scanf() est plus rapide que cin lors de la lecture d'une entrée en C a une part de vérité. Voici une explication :
Analyse comparative de vitesse
Pour vérifier cette affirmation, un programme de test simple a été créé pour lire une liste de nombres à partir de l'entrée standard et calculer leur OU exclusif ( XOR). Deux versions du programme ont été testées : l'une utilisant iostream (cin et cout) et l'autre utilisant stdio (scanf et printf).
Lorsqu'elle a été testée avec une grande quantité d'entrées (33 280 276 nombres aléatoires), la version scanf a largement surpassé la version iostream, accomplissant la tâche en 6,4 secondes contre 24,3 secondes.
Raison de la différence de vitesse
La différence de vitesse est due à la synchronisation d'iostream avec C's I Fonctions /O. Les opérations d'entrée et de sortie utilisant iostream sont synchronisées avec les fonctions d'E/S C (par exemple, getchar(), putchar()), ce qui introduit une surcharge supplémentaire.
Optimisation avec ios::sync_with_stdio(false)
Pour résoudre ce problème de synchronisation, std::ios::sync_with_stdio(false) peut être utilisé pour désactiver la synchronisation entre iostream et stdio. Cela permet à iostream de fonctionner plus efficacement sans la surcharge de synchronisation.
Après la désactivation de la synchronisation, les performances de la version iostream se sont considérablement améliorées, accomplissant la tâche en 5,5 secondes, plus rapidement que la version scanf.
Conclusion
Sur la base des résultats de l'analyse comparative, l'utilisation de scanf() est en effet plus rapide que l'utilisation de cin lors de la lecture d'une grande quantité d'entrées dans des programmes C. Cependant, avec l'optimisation de std::ios::sync_with_stdio(false), iostream peut potentiellement surpasser scanf() et doit être considéré comme le choix préféré pour les opérations d'entrée et de sortie.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!