cout ou printf lequel des deux a une vitesse d'exécution rapide C++?
J'ai été codage en C++ pour un long moment. Je me suis toujours demandé qui a une vitesse d'exécution rapide printf
ou cout
?
Situation: je suis en train de concevoir une application en C++ et j'ai certaines contraintes telles que le temps imparti pour l'exécution. Ma demande a la charge de l'impression des commandes sur la console. Alors, qui serait préférable printf
ou cout
?
- S'il est important pour vous, d'écrire une petite application qui fait les deux et le temps. Qui devrait vous prendre toutes les 15 minutes pour le faire.
- il n'est pas simple. std::cout et l'opérateur<< causer plus de code pour être émis au moment de l'appel. Tous printf logique est situé dans le CRT, mais utilise d'exécution de la logique d'interpréter l'argument chaîne. Ainsi, d'importants programmes avec de nombreux sites d'appel et de nombreuses directives de mise en forme peut voir les différents effets qu'un petit programme de test avec juste un gros
for(a lot) { printf("%d",i); }
- pas pour quelque chose que de faire de la console I/O - le programme sera I/O bound. Et ce que vous dites est un argument pour ne jamais tester quoi que ce soit.
- je pense qu'il est juste de dire que si quoi que ce soit, printf est plus rapide. (oui j'ai mesuré, oui j'ai éteint stdio synchronisation - tous ont été plus lent que le cout).
- Double Possible de ce qui est plus rapide, et qui est plus souple: printf ou de cout?
Vous devez vous connecter pour publier un commentaire.
Avez-vous vraiment besoin de soins qui a une vitesse d'exécution rapide? Ils sont simplement utilisés pour l'impression de texte à la console/stdout, qui, généralement, n'est pas une tâche qui demande de l'ultra-haute efficacité énergétique. Pour cette question, je ne peux pas imaginer qu'il y ait une grande différence de vitesse de toute façon (même si une pourrait attendre
printf
à être légèrement plus rapide, car il manque les complications mineures de l'objet-orienté). Cependant, étant donné que nous avons affaire à des opérations d'e/S ici, même une petite différence serait probablement submergés par le I/O de frais généraux. Certainement, si vous avez comparé les méthodes équivalentes pour l'écriture de fichiers, ce qui serait le cas.printf
est tout simplement la façon standard de texte de sortie vers stdout dans C.'cout' la tuyauterie est tout simplement le moyen standard pour imprimer du texte sur la sortie standard en C++.
En disant tout cela, il y a un thread sur le comp.lang.cc groupe de discussion d'un même problème. Un Consensus semble cependant être que vous devez choisir l'un sur l'autre pour des raisons autres que la performance.
Chacun a ses propres frais. En fonction de ce que vous imprimez, soit peut-être plus rapide.
Voici deux points qui me viennent à l'esprit -
printf() doit analyser le "format" de la chaîne et d'agir sur elle, ce qui ajoute un coût.
le cout est de plus en plus complexe hiérarchie d'héritage et passe autour des objets.
Dans la pratique, la différence n'est pas question pour tous les, mais le plus étrange cas. Si vous pensez que c'est vraiment important - mesure!
MODIFIER -
Oh, zut, je ne crois pas que je suis en train de faire cela, mais pour l'enregistrement, sur mon très spécifique de cas de test, avec mon très spécifique de la machine et de son très spécifique de la charge, de la compilation en Version à l'aide de MSVC
L'impression de 150 000 "Hello, World!"s (sans utiliser endl) prend environ -
90ms pour printf(), 79ms pour cout.
L'impression de 150 000 doubles aléatoires prend environ -
3450ms pour printf(), 3420ms pour cout.
(en moyenne plus de 10 pistes).
Les différences sont tellement mince, cela signifie probablement rien...
La raison C++ cout est lent, c'est la valeur par défaut de synchronisation avec stdio.
Essayez d'exécuter les opérations suivantes pour désactiver cette question.
ios_base::sync_with_stdio(false)
http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/
http://msdn.microsoft.com/es-es/library/7yxhba01.aspx
Sur Windows, au moins, de l'écriture à la console est un énorme goulot d'étranglement, afin de "bruits" de la console en mode programme sera beaucoup plus lent que silencieux. Donc, sur cette plate-forme, de légères différences dans les fonctions de la bibliothèque utilisée pour traiter la console sera probablement pas de différence significative dans la pratique.
Sur d'autres plates-formes, il peut être différente. Aussi, il dépend de combien la sortie de la console que vous faites, par rapport à d'autres travaux utiles.
Enfin, cela dépend de votre plate-forme de mise en œuvre de la C et C++ bibliothèques d'e/S.
Donc il n'y a pas de réponse générale à cette question.
La Performance est un non-problème pour la comparaison; ne peut pas penser à quelque chose, où qu'elle compte (développement d'une console-programme). Cependant, il ya quelques points que vous devez prendre en compte:
Iostreams utilisation de l'opérateur de chaînage au lieu de va_args. Cela signifie que votre programme ne peut pas bloquer car vous avez passé le mauvais nombre d'arguments. Cela peut se produire avec printf.
Iostreams utiliser la surcharge d'opérateur au lieu de va_args -- cela signifie que votre programme ne peut pas bloquer car vous avez passé un int et il s'attendait à une chaîne. Cela peut se produire avec printf.
Iostreams n'ont pas de support natif pour le format des chaînes de caractères (qui est la principale cause de #1 et #2). C'est généralement une bonne chose, mais parfois ils sont utiles. Le coup de pouce format de la bibliothèque apporte cette fonctionnalité pour Iostreams pour ceux qui en ont besoin avec comportement défini (déclenche une exception) plutôt que d'un comportement indéfini (comme c'est le cas avec printf). Actuellement, il est en dehors de la norme.
Iostreams, à la différence de leurs printf equivilants, peut gérer de longueur variable tampons directement eux-mêmes au lieu de vous être forcé de traiter avec codée en dur dans les fichiers inutiles.
Aller pour cout.
Un autre Débordement de Pile question adressée à la vitesse relative de C-mise en forme du style I/O vs C++ iostreams:
Pourquoi est-snprintf plus vite que ostringstream ou est-il?
http://www.fastformat.org/performance.html
Noter, cependant, que les indices de référence ont été discutés pour le formatage de la mémoire tampon. Je suppose que si vous êtes réellement effectuer le I/O d'une console ou d'un fichier que la vitesse relative des différences serait beaucoup plus petite en raison de l'I/O qui prend plus de temps.
J'ai récemment été de travailler sur une application console C++ sur windows que les fichiers copiés à l'aide de CopyFileEx et faisait écho au " à " et " de " les chemins de la console pour chaque copie, puis en affichant le débit moyen à la fin de l'opération.
Quand j'ai couru l'application de console à l'aide de printf en écho les cordes je commençais à 4 mo/sec, lors du remplacement de l'printf avec std::cout le débit a chuté à 800ko/sec.
Je me demandais pourquoi le std::cout d'appel était donc beaucoup plus cher et est même allé jusqu'à l'écho de la même chaîne sur chaque copie pour obtenir une meilleure comparaison, sur les appels. J'ai fait plusieurs courses pour la même comparaison, mais le 4x différence a persisté.
Puis j'ai trouvé cette réponse sur stackoverflow..
De commutation sur la mise en mémoire tampon de sortie standard (stdout) a fait le tour, maintenant, mon débit numéros pour printf et std::cout sont à peu près la même.
Je n'ai pas creusé plus profondément dans la façon dont printf et cout diffèrent dans la console de sortie de mise en mémoire tampon, mais le réglage du tampon de sortie, avant que je commence l'écriture de la console résolu mon problème.
Dans la pratique, j'ai toujours trouvé printf être plus rapide que cout. Mais là encore, cout fait beaucoup plus pour vous en termes de sécurité de type. Rappelez-vous aussi printf est une fonction simple, alors que le cout est un objet basé sur un complexe des flux de hiérarchie, de sorte qu'il n'est pas vraiment juste de comparer les temps d'exécution.
Si vous êtes à l'aide de C++, vous devez utiliser
cout
plutôt queprintf
appartient à la C la famille de fonctions. Il y a de nombreuses améliorations pourcout
que vous pouvez bénéficier. Comme pour la vitesse, il n'est pas un problème en tant que console de I/O est lente, de toute façon.Pourquoi ne pas faire une expérience? En moyenne, pour moi, l'impression de la chaîne helloperson;\n à l'aide de printf prend, en moyenne, 2 tops d'horloge, tandis que le cout à l'aide endl prend une énorme quantité de temps 1248996720685 tops d'horloge. À l'aide de cout avec "\n", comme le saut de ligne ne prend que 41981 tops d'horloge. L'URL courte pour que mon code est ci-dessous:
rpc.sh/94qoj
lien a peut-être expiré.
Pour répondre à votre question, printf est plus rapide.
Oui, j'ai utilisé le mot con. J'ai d'abord fait pour moi-même, penser que les résultats étaient fous, j'ai donc cherché à en place, qui a fini avec moi de poster mon code.
Espérons que cela aide,
Ndrewffght
Si jamais vous avez besoin de savoir pour des raisons de performances, il manque quelque chose de fondamentalement mauvais dans votre application - envisager d'utiliser une autre fonction de journalisation ou de l'INTERFACE utilisateur 😉
Pour régler ce:
produit identique les horaires pour cout et printf.
Sous le capot, les deux utilisent le même code, de sorte que les différences de vitesse ne sera pas question.
Si vous êtes en cours d'exécution sur Windows uniquement, le non-standard cprintf() peut-être plus vite qu'il ignore beaucoup de les flux des choses.
Cependant, il est une exigence étonnante. Personne ne peut lire que rapide. Pourquoi ne pas écrire la sortie dans un fichier, puis l'utilisateur peut naviguer sur le fichier à leurs loisirs?
Anecdotical preuve:
J'ai déjà conçu un enregistrement de la classe à utiliser ostream opérateurs - la mise en œuvre a été incroyablement lent (pour les énormes quantités de données).
Je n'ai pas d'analyser que pour beaucoup, il pourrait tout aussi bien avoir été causé par la non-utilisation ostreams correctement, ou tout simplement en raison de la quantité de données enregistrées sur le disque. (La classe a été annulés à cause des problèmes de performance et dans la pratique printf /fmtmsg style préféré).
Je suis d'accord avec les autres réponses que dans la plupart des cas, il n'a pas d'importance. Si la sortie est vraiment un problème, vous devriez envisager les moyens d'éviter /retarder, comme l'affichage réel des mises à jour coûtent plus que correctement mise en œuvre de la chaîne de construire. Des milliers de lignes de défilement en l'espace de quelques millisecondes n'est pas très instructif en tout cas.
Vous devriez jamais besoin de poser cette question, car l'utilisateur ne peut lire plus lent que les deux d'entre eux.
Si vous avez besoin d'une rapidité d'exécution, n'utilisez pas non plus.
Comme d'autres l'ont mentionné, utilisez un certain type d'enregistrement si vous avez besoin d'un registre des opérations.