Je tire la différence entre différentes manières d'imprimer du texte à la sortie standard. Je teste cout code>,
printf code> et
ostringstream code> à l'aide des deux
\ n code> et
std :: endl code>. Je m'attendais à
std :: endl code> pour faire une différence avec
COUT code> (et cela a fait), mais je ne m'attendais pas à ralentir la sortie avec
OstringingStream code>. Je pensais utiliser
std :: endl code> n'écrirait pas un
\ n code> au flux et il ne serait toujours pas flushé une fois. Que se passe t-il ici? Voici tout mon code:
time ./cout.out > output.txt
real 0m1.771s
user 0m0.616s
sys 0m0.148s
time ./printf.out > output.txt
real 0m2.411s
user 0m0.392s
sys 0m0.172s
time ./stream.out > output.txt
real 0m2.048s
user 0m0.632s
sys 0m0.220s
time ./streamn.out > output.txt
real 0m1.742s
user 0m0.404s
sys 0m0.200s
3 Réponses :
Il est souvent recommandé de ne pas utiliser Concernant pourquoi Après plus de lecture, la question intéressante semble être ceci: est une implémentation de std :: endl code> déclenche une flush du flux, qui ralentit une impression beaucoup. Voir http://fr.cpppreference.com/w/cpp/io/manip/endl p>
std :: endl code> sauf si vous voulez vraiment que le flux soit rincé. Si cela est vraiment important pour vous, dépend de votre cas d'utilisation. P>
Flush code> a un impact sur la performance même sur un Ostringstream (où aucun rinçage ne devrait arriver): il semble que une implémentation soit nécessaire pour construire au moins les objets sentinels. Ceux-ci doivent vérifier
bon code> et
Cravate code> du
ostream code>. L'appel à
pubsync code> devrait pouvoir être optimisé. Ceci est basé sur ma lecture de libcpp et de libstdc ++. P>
basic_ostringstream :: flush code> vraiment nécessaire pour construire l'objet Sentry? Sinon, cela ressemble à une "qualité de mise en œuvre". Mais je pense en fait que cela a besoin, car même un
basic_stringbug code> peut changer pour avoir son
Badbit code> SET. P>
En fait, je savais que, mais je ne savais pas que cela affectait la performance de Stringstream. Rincer Couts signifie émettre ce qui est dans la mémoire tampon de sortie, que signifie rincer StringStream? Quelle est la sortie que le texte se fait rougir?
@ gsingh2011 c'est ce que je penserais. Mais basic_ostringstream code> a en fait
basic_stringbuf code> ci-joint et est requis pour construire la sentinelle mentionnée dans la documentation de
Flush code>.
Utiliser n'utilise pas En outre, ne vous inquiétez pas des extrémités de ligne différentes sur différentes plates-formes, votre implémentation traduira std :: endl code> équivaut à écrire
std :: endl code> sauf si vous ne voulez pas réellement déclencher le rinçage et / ou ne se soucient pas des performances de sortie. p>
"\ n" code> à la ligne de ligne appropriée pour votre plate-forme. P> < / p>
Chaque opération de sortie sur un flux dors plusieurs étapes:
endl code> appelle une fonction virtuelle supplémentaire sur le tampon de flux. LI>
ul> J'attendrais personnellement que l'appel de la fonction virtuelle supplémentaire ait réellement un impact relativement faible par rapport aux autres opérations. Vous pouvez vérifier cette hypothèse en profilant également cette sortie: p> xxx pré> ... ou même p> xxx pré> qui dit, sont un certain nombre d'améliorations qu'une implémentation de flux peut s'appliquer pour réduire les chèques. Si cela est fait dépendra de la mise en œuvre, bien sûr. P> p>
Cela répondra probablement à votre question: Stackoverflow.com/questions/213907/c-stdendl-vs-n A> En bref: oui, std :: endl rougit la sortie
Je ne sais pas si je lisais cette question tort, mais j'ai supposé qu'il demandait pourquoi rincer le Stringstream aurait une question de performance. Quel travail supplémentaire gouffre un stringstream que cela ne pouvait pas simplement être laissé à l'appel à
.str () code>? Pour
COUT CODE>, le rendu au terminal prendra du temps, il y a des effets secondaires visibles de rincer un Stringstream?
@stefan J'ai réellement lu cette question, mais je me demande en partie ce que cela signifie de rincer un StringStream. Je pensais que cela ne ferait que rien, mais apparemment je me trompe.
@ gsingh2011 C'est toujours un appel de la fonction, même si la fonction pourrait ne rien faire. Néanmoins, il y aura probablement une surcharge générale notable sans aucune optimisation.
@stefan j'ai optimisé avec O3 et les effivants relatifs de chaque méthode sont les mêmes.
Quel compilateur et quelle implémentation STD a-t-il été testé ici?
@ Brays53 Bonne question. g ++ (Ubuntu / Linaro 4.6.3-1Buntu5) 4.6.3