Maison  >  Article  >  développement back-end  >  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 ?

DDD
DDDoriginal
2024-11-23 07:23:18866parcourir

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

Pourquoi la lecture des lignes depuis stdin en C est plus lente qu'en Python

Malgré les attentes, le code C pour lire les lignes d'entrée à partir de l'entrée standard peut fonctionnent beaucoup plus lentement que leurs homologues Python. Cet écart provient des paramètres par défaut en C.

Configuration du flux d'entrée par défaut

Par défaut, le flux d'entrée C (cin) est synchronisé avec l'entrée/sortie standard (stdio ). Cette synchronisation signifie que cin tente d'éviter toute mise en mémoire tampon d'entrée, ce qui l'amène à lire les caractères un par un.

Pourquoi la mise en mémoire tampon est importante

En général, les flux d'entrée tamponnent l'entrée dans un format plus grand. morceaux, réduisant ainsi le nombre d’appels système requis pour la récupération des données. Cependant, des implémentations et des tampons distincts pour les stdio et iostreams basés sur FILE* peuvent entraîner des problèmes lorsqu'ils sont utilisés ensemble.

Pour éviter des conflits potentiels, les flux sont synchronisés avec stdio par défaut. Cin lit les caractères un par un, ce qui entraîne une surcharge importante, en particulier lors du traitement de millions de lignes.

Solution

Pour améliorer les performances, désactivez la synchronisation du flux à l'aide de sync_with_stdio(false) méthode au début de la fonction principale :

std::ios_base::sync_with_stdio(false);

Avec ce changement, les flux C peuvent être mis en mémoire tampon indépendamment, ce qui entraîne une entrée plus rapide manipulation.

Approche alternative : fgets

Une autre façon d'améliorer la vitesse de saisie consiste à utiliser la fonction fgets au lieu de getline :

char buffer[1024];
while (fgets(buffer, sizeof(buffer), stdin)) {
    // Process the line
}

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