Me di cuenta que si imprimía una cadena larga (char *) usando cout, parece imprimir 1 carácter a la vez en Windows 7, Vista y Linux (usando masilla) usando Visual C++ 2008 en Windows y G ++ en Linux. Printf es mucho más rápido. De hecho, cambié de cout a printf para la mayoría de las impresiones en un proyecto mío. Esto me confunde porque question hace que parezca que soy el único que tiene este problema.C++ cout printing slowly
Incluso escribí un reemplazo cout que parece que supera los pantalones de cout en mi comp -
class rcout
{
public:
char buff[4096];
unsigned int size;
unsigned int length;
rcout()
{
size = 4096;
length = 0;
buff[0] = '\0';
}
~rcout()
{
printf("%s", buff);
}
rcout &operator<<(char *b)
{
strncpy(buff+length, b, size-length);
unsigned int i = strlen(b);
if(i+length >= size)
{
buff[size-1] = '\0';
printf("%s", buff);
b += (size-length) -1;
length = 0;
return (*this) << b;
}
else
length += i;
return (*this);
}
rcout &operator<<(int i)
{
char b[32];
_itoa_s(i, b, 10);
return (*this)<<b;
}
rcout &operator<<(float f)
{
char b[32];
sprintf_s(b, 32, "%f", f);
return (*this)<<b;
}
};
int main()
{
char buff[65536];
memset(buff, 0, 65536);
for(int i=0;i<3000;i++)
buff[i] = rand()%26 + 'A';
rcout() << buff << buff <<"\n---"<< 121 <<"---" << 1.21f <<"---\n";
Sleep(1000);
cout << "\n\nOk, now cout....\n\n";
cout << buff << buff <<"\n---"<< 121 <<"---" << 1.21f <<"---\n";
Sleep(1000);
cout << "\n\nOk, now me again....\n\n";
rcout() << buff << buff <<"\n---"<< 121 <<"---" << 1.21f <<"---\n";
Sleep(1000);
return 0;
}
Cualquier idea por qué Court está imprimiendo tan lentamente para mí?
Lo intenté en la computadora Linux nuevamente, y cout y rcout parecían tener la misma velocidad, pero sé que cout fue mucho más lento que printf en mi otra aplicación, así que estoy pensando que podría ser porque era multiproceso? Luego lo probé en mi comp de Vista y la grabación tardó unos 375 ms, mientras que el rcout tardó unos 100 ms. En la compilación de Windows 7 tomó 850 ms y rcout tomó alrededor de 70 ms. –
'<< endl'? 'cout' no vacía automáticamente los datos. Es posible que se esté ejecutando en Windows al almacenar en búfer los datos de forma diferente a como lo hace con 'printf'.Pruebe también 'cerr' en lugar de' cout' y vea si hace una diferencia: si lo hace, el enjuague es definitivamente el problema. – quark
cerr realizó lo mismo que cout, también haciendo un flush() después de que el cout no ayuda –