Pourquoi la lecture des lignes depuis stdin est-elle beaucoup plus lente en C qu'en Python ?
Contexte :
La lecture des lignes de chaîne saisies à partir de stdin en utilisant C peut être considérablement plus lente que son équivalent Python. Cet écart est dû aux paramètres par défaut en C qui nécessitent davantage d'appels système.
Comportement par défaut des flux d'entrée :
Par défaut, le flux d'entrée C cin est synchronisé avec la bibliothèque standard C I/O (stdio). Cette synchronisation garantit que l'entrée n'est pas mise en mémoire tampon et est lue un caractère à la fois. Bien que ce comportement évite les conflits entre les fonctions cin stream et stdio, il entraîne également une pénalité de performances.
Utilisation des appels système :
Lorsque cin est synchronisé avec stdio, chaque caractère lu déclenche un appel système, une opération coûteuse. Cette surcharge ralentit considérablement le processus de saisie, notamment lors de la lecture de grandes quantités de données.
Solution :
Pour améliorer les performances de lecture de ligne en C , on peut désactiver la synchronisation entre cin et stdio. Ceci peut être réalisé en appelant la méthode sync_with_stdio(false).
Alternativement, l'utilisation de la fonction fgets au lieu de getline contourne également la surcharge de synchronisation.
Comparaison des performances :
Voici une comparaison des performances entre l'implémentation C originale (synchronisée) et diverses 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 (not a fair comparison) | 54,644,808 |
Conclusion :
La désactivation de la synchronisation entre cin et stdio ou l'utilisation de fgets peut améliorer considérablement les performances de lecture de ligne en C, la rendant comparable à L'efficacité de Python.
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!