Maison >développement back-end >C++ >Pourquoi l'entrée stdin de C est-elle considérablement plus lente que celle de Python et comment peut-elle être améliorée ?

Pourquoi l'entrée stdin de C est-elle considérablement plus lente que celle de Python et comment peut-elle être améliorée ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-18 11:57:16871parcourir

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

Pourquoi la lecture des lignes depuis stdin est-elle beaucoup plus lente en C qu'en Python ?

La lecture des lignes depuis l'entrée standard (stdin) peut être considérablement plus lente en C par rapport à Python en raison de paramètres par défaut différents dans le flux d'entrée C.

Par défaut Buffering

Par défaut, le flux d'entrée C (cin) est synchronisé avec les flux d'entrée/sortie standard (stdio). Cette synchronisation oblige cin à éviter toute mise en mémoire tampon d'entrée, ce qui entraîne une lecture d'un caractère à la fois.

Python Buffering

En revanche, le flux stdin en Python est mis en mémoire tampon par défaut, ce qui lui permet de lire de plus gros morceaux d'entrée à la fois. Cela réduit le nombre d'appels système nécessaires pour lire les données, ce qui entraîne une amélioration des performances.

Correction du code C

Pour obtenir des performances similaires en C, vous pouvez désactiver la synchronisation avec stdio en ajoutant la ligne suivante au début de votre fonction principale :

std::ios_base::sync_with_stdio(false);

Cela permet à cin de buffer son entrée et améliore considérablement la lecture speed.

fgets vs. getline

De plus, vous pouvez envisager d'utiliser fgets au lieu de getline(), qui est une fonction C qui lit une ligne de texte à partir d'un fichier ou entrée standard. fgets a l'avantage de ne pas nécessiter d'allocation de mémoire dynamique, améliorant encore les performances.

Comparaison des performances

Vous trouverez ci-dessous un tableau comparant les lignes par seconde (LPS) pour différentes approches en utilisant un fichier de lignes de 100 Mo :

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 (not fair comparison) 54,644,808

Comme vous pouvez le constater, la désactivation de la synchronisation ou l'utilisation de fgets améliore considérablement les performances de 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