Ce programme:
$ time ./joe 10000000 fred >/dev/null real 0m39.115s user 0m16.482s sys 0m15.803s
6 Réponses :
La vraie question est, pourquoi le compilateur a-t-il fait un petit-déjeuner aussi chiens de compiler la version endl? Si elles sont garanties d'avoir la même sémantique, ils devraient également avoir le même moment d'exécution. P>
Edit: Évidemment, je ne savais pas que Endl a rougé le ruisseau ... c'est ce que vous obtenez pour ne pas le regarder. P>
En fait, ils n'ont absolument pas la même sémantique.
Eh bien, ils pourraient faire, ils ne sont tout simplement pas garantis par la norme C ++.
@Neil Butterworth, la standard permet :: std :: cout code> à découper?
Non, mais la norme ne spécifie pas l'effet de la sortie '\ n'.
@Neil Butterworth, ahh. rire i> Je suppose qu'il y a précédent. La bibliothèque STDIO en C traite «\ N» spécialement et automatiquement lorsqu'elle est rencontrée. Ils l'appellent "tampon de ligne".
Sur de nombreux UNIXES, std :: COUT CODE> et
stdout code> ne sont en mémoire tamponnée que lorsque la sortie est connectée à un terminal interactif et non (par exemple) lorsqu'il est connecté à un fichier ou à d'autres périphériques. .
Tout le monde ne se soucie pas tellement de performances. Pour certaines applications, garantir que le flux est rinçage est beaucoup plus important. P>
edit: strong> aussi, je trouve endl code> plus facile à taper que
'\ n' code>: -) p>
Dans presque aucun cas, où je vois endl code> utilisé est-il compte réellement si le flux est rougi à droite puis et là-bas. :-)
Les applications de journalisation, les communications réseau et les bases de données se présentent immédiatement à l'esprit.
Les gens devraient utiliser :: STD :: CERR CODE> ou un autre flux débrouillard pour la journalisation. Je n'ai jamais vu une application de réseau ou une base de données réseau sérieuse qui utilisait des iOSTreams pour la communication sur le réseau ou l'écriture dans la base de données.
Vous êtes la première personne à donner une réponse réelle, bien que je ne suis pas d'accord avec cela. :-)
Il existe très peu d'utilisations étaient des performances et des flux sont nécessaires dans la même application. Dans ce cas, il est généralement plus facile d'être cohérent et d'utiliser STD :: endl (en dehors des exemples de programmes pour démontrer la différence). Est-ce que je me soucie vraiment si une application prend 15 ou 30 secondes.
En fait, Martin, c'est mon point, si vous utilisez STD :: iOSTream, alors vous vous êtes dit tant sur la performance, et si vous vous souciez de la performance, vous ne vous souciez pas trop de la portabilité, alors il y a vraiment peu de cas lorsque vous Soin des deux choses, vous devez donc vous inquiéter d'utiliser un personnage de Newline approprié au lieu de STD :: endl
@ Erick2red, sauf '\ n' n'est pas moins portable que endl. Il n'y a pas de compromis de performance de portabilité dans l'utilisation. IMHO, c'est tout à fait insensé d'utiliser endl. Les gens n'ont presque jamais besoin de rincer réellement le flux quand ils l'utilisent, ils viennent de l'avoir vus dans un livre et de le faire de cette façon maintenant sans penser ni comprendre la différence.
afaik, endl afflève également le flux, ce qui peut être la cause de la pénalité de performance. P>
Vous avez raison. STD :: endl rougit le tampon de sortie et "\ n" ne le fait pas.
Je sais pourquoi la pénalité de performance existe. :-) Ma question est la suivante: pourquoi est :: std :: endl code> toujours "ce qui est fait" même s'il a cette pénalité de performance?
Probablement parce que la plupart des programmeurs l'aiment lorsque leur utilisateur peut voir la sortie au lieu de les forcer à attendre que le tampon se remplisse. Compte tenu de la vitesse des dispositifs de sortie réels, cela ne compte jamais vraiment.
Je ne suis pas certain. Insertionner Mon hypothèse est que cela provient d'une croyance incorrecte selon laquelle il est d'une manière ou d'une autre, plus portable, car il n'utilise pas explicitement un caractère spécifique nouveau. Ceci est incorrect car std :: endl code> dans le flux de sortie est défini comme étant équivalent à l'insertion de
.Widen ('\ n') code> puis appelant
affleurant () code > Et encore de nombreux programmeurs persistent à utiliser
std :: endl code> même lorsqu'il n'y a aucune raison de chasser, par exemple, ils continuent à produire immédiatement autre chose. P>
\ n code> doit toujours être mappé sur la séquence de nouvelle ligne correcte du système pour les fichiers non binaires par la bibliothèque de flux. P>
Vous savez, vous êtes la première personne qui a donné une réponse réelle. :-) Demander des questions de pointe vous propose nulle part sur ce site. J'ai besoin de trouver une meilleure façon d'indiquer des questions que j'avais l'intention d'être instructionnaire.
J'ai aussi donné une réponse réelle, comme cela arrive. Vous n'êtes peut-être pas d'accord avec cela, bien sûr.
@Neil Butterworth, Oh, d'accord. Oui, Charles est la deuxième personne à donner une réponse réelle. :-) Toi aussi.
Aussi, à proprement parler ma réponse n'est pas complètement hypothétique; C'est une extraction d'une taille d'échantillon incroyablement faible de développeurs que j'ai parlé à ce sujet. L'extrapolation a probablement une validité statistique très fragile.
L'intérêt dans cette question s'est fané et vous avez certainement la meilleure réponse, avec des données réelles réelles à la sauvegarder. :-)
J'ai tendance à utiliser Endl avec à Stringstreams car il est facile de repérer des lampes manquantes. p>
Je suppose que les textes pédagogiques utilisent std :: endl code> avec la croyance qu'il est plus simple et moins déroutant pour les débutants et les gens se sont ensuite habitués à l'utiliser. P>
Pouvez-vous me faire savoir quelle partie de la norme garantit que la sortie sera la même sur toutes les plateformes?
Voir: Stackoverflow.com/Questtions/213907/c-stdendl-vs-n