La réponse directe est que, oui, c'est correct.
Beaucoup de gens ont jeté autour de différentes idées pour améliorer la vitesse, mais il semble être tout à fait un peu de désaccord sur ce qui est le plus efficace. J'ai décidé d'écrire un petit programme de test pour obtenir au moins une idée de quelles sont les techniques qui a fait quoi.
#include <iostream>
#include <sstream>
#include <time.h>
#include <iomanip>
#include <algorithm>
#include <iterator>
#include <stdio.h>
static const int count = 3000000;
static char const *const string = "This is a string.";
void show_time(void (*f)(), char const *caption) {
clock_t start = clock();
f();
clock_t ticks = clock()-start;
std::cerr << std::setw(30) << caption
<< ": "
<< (double)ticks/CLOCKS_PER_SEC << "\n";
}
void use_printf() {
for (int i=0; i<count; i++)
printf("%s\n", string);
}
void use_puts() {
for (int i=0; i<count; i++)
puts(string);
}
void use_cout() {
for (int i=0; i<count; i++)
std::cout << string << "\n";
}
void use_cout_unsync() {
std::cout.sync_with_stdio(false);
for (int i=0; i<count; i++)
std::cout << string << "\n";
std::cout.sync_with_stdio(true);
}
void use_stringstream() {
std::stringstream temp;
for (int i=0; i<count; i++)
temp << string << "\n";
std::cout << temp.str();
}
void use_endl() {
for (int i=0; i<count; i++)
std::cout << string << std::endl;
}
void use_fill_n() {
std::fill_n(std::ostream_iterator<char const *>(std::cout, "\n"), count, string);
}
int main() {
show_time(use_printf, "Time using printf");
show_time(use_puts, "Time using puts");
show_time(use_cout, "Time using cout (synced)");
show_time(use_cout_unsync, "Time using cout (un-synced)");
show_time(use_stringstream, "Time using stringstream");
show_time(use_endl, "Time using endl");
show_time(use_fill_n, "Time using fill_n");
return 0;
}
J'ai couru ce sur Windows après compilation avec VC++ 2008 (les versions x86 et x64). La sortie d'un run (avec sortie redirigée vers un fichier de disque) ressemblait à ceci:
Time using printf: 1.975
Time using puts: 1.458
Time using cout (synced): 1.297
Time using cout (un-synced): 1.28
Time using stringstream: 2.03
Time using endl: 12.621
Time using fill_n: 1.285
Comme prévu, les résultats varient, mais il ya quelques points que j'ai trouvé intéressant:
- printf/met sont beaucoup plus rapides que le cout lors de l'écriture sur le NUL de l'appareil
- ...mais le cout tient très bien lors de l'écriture dans un fichier réel
- Tout à fait quelques optimisations proposées accomplir peu
- Dans mes tests, fill_n est à peu près aussi rapide que toute autre chose
De loin le plus gros de l'optimisation est d'éviter endl