Maison  >  Article  >  développement back-end  >  Est-ce que `scanf()` en C est vraiment plus rapide que `cin` pour l'entrée ?

Est-ce que `scanf()` en C est vraiment plus rapide que `cin` pour l'entrée ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-23 10:38:11951parcourir

Is `scanf()` in C   Really Faster Than `cin` for Input?

Utiliser scanf() en C : est-ce plus rapide que cin ?

En C, il est largement admis que l'utilisation de cin et cout pour la saisie et la sortie est nettement plus lente que l'utilisation de printf et scanf. Cela découle de l'hypothèse que scanf() est optimisé pour C, tandis que cin et cout sont implémentés à l'aide de fonctions d'E/S standard qui sont plus lentes.

Résultats du benchmark

Pour déterminer si cette affirmation est vraie, un simple benchmark a été réalisé impliquant un programme qui lit une liste de nombres à partir d'une entrée standard et calcule leur XOR. Le programme a été implémenté en utilisant à la fois les versions iostream et scanf :

Version iostream :

#include <iostream>

int main() {
  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 parity = 0;
  int x;

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

  return 0;
}

Lorsqu'elle a été testée avec un vaste ensemble de données de plus de 33 millions de nombres aléatoires, la version scanf s'est terminée en 6,4 secondes, tandis que la La version iostream a pris 24,3 secondes décevantes.

Impact de l'optimisation

Les paramètres d'optimisation du compilateur n'ont pas affecté de manière significative les résultats. Cela suggère que la différence de vitesse est principalement due aux différences inhérentes à l'implémentation de scanf() et cin/cout.

Le coupable : std::ios::sync_with_stdio

Une enquête plus approfondie a révélé que les fonctions d'E/S iostream maintiennent la synchronisation avec les fonctions d'E/S C. Par défaut, cette synchronisation implique de vider le tampon de sortie après chaque opération d'entrée, ce qui entraîne un ralentissement des performances.

Désactivation de la synchronisation

Heureusement, cette synchronisation peut être désactivée en appelant std ::ios::sync_with_stdio(false):

std::ios::sync_with_stdio(false);

Après avoir désactivé la synchronisation, les performances du La version iostream s'est considérablement améliorée, se terminant en seulement 5,5 secondes.

C iostream gagne

Avec la synchronisation désactivée, C iostream devient l'option la plus rapide pour ce benchmark spécifique. Il s'avère que la synchronisation interne de std::cout est le principal responsable du ralentissement des performances d'iostream.

Conclusion

Bien que l'utilisation de scanf() puisse être plus rapide dans certains Dans certains cas, la désactivation de std::ios::sync_with_stdio permet à iostream de surpasser scanf dans de nombreux scénarios, en particulier en évitant une utilisation mixte de Fonctions stdio et 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