Estoy sincronizando la diferencia entre varias formas de imprimir texto en salida estándar. Estoy probando cout
, printf
y ostringstream
usando \n
y std::endl
. Esperaba que std::endl
marcara la diferencia con cout
(y lo hizo), pero no esperaba que ralentizara la salida con ostringstream
. Pensé que al usar std::endl
se escribiría un \n
en la transmisión y solo se enjuagaría una vez. ¿Que está pasando aqui? Aquí está todo mi código:¿Por qué usar std :: endl con ostringstream afecta la velocidad de salida?
// cout.cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 0; i < 10000000; i++) {
cout << "Hello World!\n";
}
return 0;
}
// printf.cpp
#include <stdio.h>
int main() {
for (int i = 0; i < 10000000; i++) {
printf("Hello World!\n");
}
return 0;
}
// stream.cpp
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream ss;
for (int i = 0; i < 10000000; i++) {
ss << "stream" << endl;
}
cout << ss.str();
}
// streamn.cpp
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream ss;
for (int i = 0; i < 10000000; i++) {
ss << "stream\n";
}
cout << ss.str();
}
y mi Makefile
SHELL:=/bin/bash
all: cout.cpp printf.cpp
g++ cout.cpp -o cout.out
g++ printf.cpp -o printf.out
g++ stream.cpp -o stream.out
g++ streamn.cpp -o streamn.out
time:
time ./cout.out > output.txt
time ./printf.out > output.txt
time ./stream.out > output.txt
time ./streamn.out > output.txt
aquí Aquí está lo que me pasa cuando corro make
seguido por make time
time ./cout.out > output.txt
real 0m1.771s
user 0m0.616s
sys 0m0.148s
time ./printf.out > output.txt
real 0m2.411s
user 0m0.392s
sys 0m0.172s
time ./stream.out > output.txt
real 0m2.048s
user 0m0.632s
sys 0m0.220s
time ./streamn.out > output.txt
real 0m1.742s
user 0m0.404s
sys 0m0.200s
Estos resultados son consistentes.
Esto probablemente responda a su pregunta: http://stackoverflow.com/questions/213907/c-stdendl-vs-n En resumen: sí, std :: endl vacía la salida – stefan
No sé si leo esta pregunta está equivocada, pero supuse que estaba preguntando por qué enrojecer la secuencia de cadenas tendría un problema de rendimiento. ¿Qué trabajo adicional hace el enjuague de una cadena de caracteres que no se puede dejar solo a la llamada a '.str()'? Para 'cout', la renderización en el terminal llevará tiempo, ¿hay algún efecto secundario visible de enjuagar un stringstream? – loganfsmyth
@stefan Realmente he leído esa pregunta, pero en parte me pregunto qué significa tirar un hilo de cadena. Pensé que esencialmente no haría nada, pero aparentemente estoy equivocado. – gsingh2011