I noticed if I print out a long string(char*) using cout it seems to print 1 character at a time to the screen in Windows 7, Vista, and Linux(using putty) using Visual C++ 2
You should try to write all your data to an ostringstream
first, and then use cout
on the ostringstream
's str()
. I am on 64-bit Windows 7 and Test1
was already significantly faster than Test2
(your mileage may vary). Using an ostringstream
to build a single string first and then using cout
on that further decreased Test1
's execution time by a factor of about 3 to 4. Be sure to #include
.
I.e., replace
void Test1()
{
cout
<< "a:" << a << "\n"
<< "a:" << setfill('0') << setw(8) << a << "\n"
<< "b:" << b << "\n"
<< "c:" << c << "\n"
<< "d:" << d << "\n"
<< "e:" << e << "\n"
<< "f:" << setprecision(6) << f << "\n"
<< "g:" << setprecision(10) << g << endl;
}
with:
void Test1()
{
ostringstream oss;
oss
<< "a:" << a << "\n"
<< "a:" << setfill('0') << setw(8) << a << "\n"
<< "b:" << b << "\n"
<< "c:" << c << "\n"
<< "d:" << d << "\n"
<< "e:" << e << "\n"
<< "f:" << setprecision(6) << f << "\n"
<< "g:" << setprecision(10) << g << endl;
cout << oss.str();
}
I suspect ostringstream
makes this so much faster as a result of not trying to write to the screen each time you call operator<<
on cout
. I've also noticed through experience that reducing the number of times you write to the screen (by writing more at once) increases performance (again, your mileage may vary).
E.g.,
void Foo1()
{
for(int i = 0; i < 10000; ++i) {
cout << "Foo1\n";
}
}
void Foo2()
{
std::string s;
for(int i = 0; i < 10000; ++i) {
s += "Foo2\n";
}
cout << s;
}
void Foo3()
{
std::ostringstream oss;
for(int i = 0; i < 10000; ++i) {
oss << "Foo3\n";
}
cout << oss.str();
}
In my case, Foo1
took 1,092ms, Foo2
took 234ms, and Foo3
took 218ms. ostingstream
s are your friend. Obviously Foo2 and Foo3 require (trivially) more memory. To compare this against a C-style function, try sprintf
into a buffer and then write that buffer using fprintf
and you should see still more efficiency over Test2
(though for me this only improved performance of Test2
by about 10% or so; cout
and printf
are indeed different beasts under the hood).
Compiler: MinGW64 (TDM and its bundled libraries).