Maison >développement back-end >C++ >Pourquoi la lecture des entrées standard C est-elle plus lente que celle de Python et comment peut-elle être améliorée ?

Pourquoi la lecture des entrées standard C est-elle plus lente que celle de Python et comment peut-elle être améliorée ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-26 16:29:09386parcourir

Why is C   Standard Input Reading Slower Than Python's, and How Can It Be Improved?

Pourquoi la lecture d'entrée standard C n'est pas à la hauteur de l'efficacité de Python

En comparant les performances de Python et C dans la lecture des lignes d'entrée de chaîne à partir du standard input (stdin), une disparité frappante est apparue : le code C s'exécutait beaucoup plus lentement. Cela a donné lieu à une enquête sur les raisons sous-jacentes de cet écart de performances.

Le problème provient des paramètres par défaut de C . Par défaut, les istreams, tels que cin, se synchronisent avec stdio, ce qui évite la mise en mémoire tampon des entrées. Pour optimiser les performances, cette synchronisation peut être désactivée à l'aide de l'instruction std::ios_base::sync_with_stdio(false). Cet ajustement atténue une contrainte de performances majeure.

Les flux d'entrée standard fonctionnent différemment par conception entre Python et C . Celui de Python est généralement mis en mémoire tampon, tandis que celui de C n'est pas mis en mémoire tampon par défaut. Dans des circonstances normales, la mise en mémoire tampon réduit les appels système, améliorant ainsi l'efficacité. Cependant, les implémentations et tampons distincts de stdio et iostreams basés sur FILE* en C posent des problèmes potentiels lorsqu'ils sont utilisés ensemble.

Pour éviter les incohérences de tampon et les résultats inattendus, C synchronise les flux avec stdio par défaut. Bien que cela protège contre les problèmes potentiels, cela introduit une surcharge, en particulier lors du traitement de grandes quantités d'entrées.

Pour obtenir des performances maximales, les programmeurs peuvent désactiver la synchronisation à l'aide de la méthode sync_with_stdio. Cette optimisation permet aux flux standard C d'être mis en mémoire tampon indépendamment, améliorant considérablement la vitesse dans certains scénarios.

Analyse de performance

Pour une comparaison plus complète, voici une évaluation des performances avec différentes approches :

Implementation Lines per second
Python (default) 3,571,428
cin (default/naive) 819,672
cin (no sync) 12,500,000
fgets 14,285,714
wc 54,644,808 (Not a fair comparison)

Comme évident, la désactivation de la synchronisation et l'utilisation de fgets entraînent des améliorations notables des performances en C .

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