Questo programma:Perché endl viene utilizzato come sinonimo di " n" anche se incorre in penalità significative per le prestazioni?
#include <iostream>
#include <cstdlib>
#include <string>
int main(int argc, const char *argv[])
{
using ::std::cerr;
using ::std::cout;
using ::std::endl;
if (argc < 2 || argc > 3) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
unsigned long count = 10000;
if (argc > 2) {
char *endptr = 0;
count = ::std::strtoul(argv[1], &endptr, 10);
if ((argv[1][0] == '\0') || (*endptr != '\0')) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
}
const ::std::string msg((argc < 3) ? argv[1] : argv[2]);
for (unsigned long i = 0; i < count; ++i) {
cout << i << ": " << msg << '\n';
}
return 0;
}
quando cronometrato in questo modo:
$ time ./joe 10000000 fred >/dev/null
real 0m15.410s
user 0m10.551s
sys 0m0.166s
richiede 15,4 secondi di tempo reale di esecuzione. Sostituire la linea di uscita con questo: cout << i << ": " << msg << endl;
e si finisce con qualcosa di simile:
$ time ./joe 10000000 fred >/dev/null
real 0m39.115s
user 0m16.482s
sys 0m15.803s
Come si può vedere, il tempo di correre più del doppio, e il programma va di spendere tempo minimo nel sistema operativo alla spesa quasi la metà del tempo nel sistema operativo.
Entrambe le versioni del programma hanno un'uscita identica e sono garantite dallo standard per avere un'uscita identica su ogni piattaforma.
Dato questo, perché la gente persistono nell'uso endl
come sinonimo di '\n'?
Edit: Nel caso in cui non è ovvio, la questione è destinato ad essere una domanda di primo piano ed è qui per scopi didattici . So perché esiste la penalizzazione delle prestazioni.
Puoi farmi sapere quale parte dello standard garantisce che l'output sarà lo stesso su tutte le piattaforme? – Glen
Vedere: http://stackoverflow.com/questions/213907/c-stdendl-vs-n –