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 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!