Ho notato che se stampo una stringa lunga (char *) usando cout sembra stampare 1 carattere alla volta sullo schermo di Windows 7, Vista e Linux (usando stucco) usando Visual C++ 2008 su Windows e G ++ su Linux. Printf è così molto più veloce che ho passato da cout a printf per la maggior parte della stampa in un mio progetto. Questo mi confonde perché questo question sembra che io sia l'unico ad avere questo problema.C++ cout printing lentamente
Ho anche scritto una sostituzione cout che sembra che batte i pantaloni fuori di cout sul mio 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;
}
Tutte le idee perché cout sta stampando così lentamente per me?
Ho provato di nuovo sul computer Linux, e cout e rcout sembravano avere la stessa velocità, ma so che cout era molto più lento di printf nella mia altra app quindi penso che potrebbe essere perché era multithreaded? Poi l'ho provato sul mio comp Vista e ci sono voluti circa 375 ms mentre Rcout ha impiegato circa 100 ms. Su Windows 7 comp cout ci sono voluti 850 ms e Rcout ha impiegato circa 70 ms. –
'<< endl'? 'cout' non scarica automaticamente i dati. È possibile che tu stia eseguendo il buffering dei dati in Windows in modo diverso rispetto a 'printf'.Prova anche 'cerr' invece di' cout' e vedi se fa la differenza: se lo svuota è sicuramente il problema. – quark
cerr ha eseguito la stessa cosa di cout, anche facendo un flush() dopo che il cout non aiuta –