Este programa:¿Por qué endl se usa como sinónimo de " n" aunque incurre en penalizaciones de rendimiento significativas?
#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;
}
cuando programado de esta manera:
$ time ./joe 10000000 fred >/dev/null
real 0m15.410s
user 0m10.551s
sys 0m0.166s
toma 15,4 segundos de tiempo real para ejecutar. Vuelva a colocar la línea de salida con esto: cout << i << ": " << msg << endl;
y terminas con algo como esto:
$ time ./joe 10000000 fred >/dev/null
real 0m39.115s
user 0m16.482s
sys 0m15.803s
Como se puede ver, el tiempo para correr a más del doble, y el programa pasa de pasar el tiempo mínimo en el sistema operativo para el gasto casi la mitad de su tiempo en el sistema operativo.
Ambas versiones del programa tienen salida idéntica, y están garantizadas por el estándar para tener salida idéntica en cada plataforma.
Teniendo en cuenta esto, ¿por qué la gente insiste en el uso de endl
como sinónimo de '\n'?
Editar: En caso de que no es obvio, esta cuestión está destinada a ser una cuestión de liderazgo y está aquí para fines de instrucción . Sé por qué existe la penalización de rendimiento.
¿Puede decirme qué parte de la norma garantiza que la salida será la misma en todas las plataformas? – Glen
Ver: http://stackoverflow.com/questions/213907/c-stdendl-vs-n –