Maison  >  Article  >  développement back-end  >  Scanf() surpasse-t-il toujours iostream en termes de vitesse d'entrée C ?

Scanf() surpasse-t-il toujours iostream en termes de vitesse d'entrée C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-19 11:13:02356parcourir

Does scanf() Always Outperform iostream in C   Input Speed?

Scanf() peut-il surpasser iostream dans les performances C ?

L'idée selon laquelle scanf() fournit une gestion des entrées plus rapide que cin en C a suscité un débat entre programmeurs. Cet article approfondit la comparaison des performances entre ces méthodes, examine les preuves et fournit une explication détaillée.

Tests de performances

Pour évaluer la différence de performances, un programme simple a été créé qui lit une liste de nombres à partir de l'entrée standard et effectue une opération XOR sur eux. cin et scanf() ont été utilisés dans des implémentations distinctes :

  • cin Version :
#include <iostream>

int main() {
  int parity = 0;
  int x;

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}
  • scanf Version :
#include <stdio.h>

int main() {
  int parity = 0;
  int x;

  while (1 == scanf("%d", &x))
    parity ^= x;
  printf("%d\n", parity);

  return 0;
}

Résultats

À l'aide d'un fichier contenant plus de 33 millions de nombres aléatoires, les temps d'exécution ont été mesurés :

  • Version cin : 24,3 secondes
  • Version scanf : 6.4 secondes

Considérations d'optimisation

La modification des paramètres d'optimisation du compilateur a eu un impact minimal sur les résultats.

Performances iostream améliorées

Il a été découvert que l'écart de performances est en partie dû au fait que iostream maintient la synchronisation avec le C I/O. fonctions. En désactivant cette synchronisation avec la commande std::ios::sync_with_stdio(false), les performances d'iostream se sont considérablement améliorées :

#include <iostream>

int main() {
  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

Après la désactivation de la synchronisation iostream :

  • Version cin avec synchronisation : 21.9 secondes
  • Version scanf : 6,8 secondes
  • Version cin sans synchronisation : 5,5 secondes

Conclusion

Les preuves suggèrent que scanf() est en effet plus rapide que cin pour la gestion des entrées brutes en C . Cependant, si la synchronisation d'iostream est désactivée, iostream devient le meilleur choix, surpassant à la fois scanf() et la version optimisée cin.

Par conséquent, même si scanf() peut être plus rapide pour des scénarios spécifiques, iostream offre un meilleur contrôle sur la synchronisation. et une gamme plus large de fonctionnalités. Lorsque la vitesse est cruciale, il est recommandé de désactiver la synchronisation iostream.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn