Re: C++ is Slow?
nw wrote:
Hi all,
I'm constantly confronted with the following two techniques, which I
believe often produce less readable code, but I am told are faster
therefore better. Can anyone help me out with counter examples and
arguments?
1. The STL is slow.
More specifically vector. The argument goes like this:
"Multidimensional arrays should be allocated as large contiguous
blocks. This is so that when you are accessing the array and reach the
end of a row, the next row will already be in the cache. You also
don't need to spend time navigating pointers when accessing the array.
So a 2 dimensional array of size 100x100 should be created like this:
const int xdim=100;
const int ydim=100;
int *myarray = malloc(xdim*ydim*sizeof(int));
and accessed like this:
myarray[xdim*ypos+xpos] = avalue;
Is this argument reasonable? (Sounds reasonable to me, though the
small tests I've performed don't usually show any significant
difference).
To me this syntax looks horrible, am I wrong? Is vector the wrong
container to use? (My usual solution would be a vector<vector<int> >).
Would using a valarray help?
2. iostream is slow.
I've encountered this is work recently. I'd not considered it before,
I like the syntax and don't do so much IO generally... I'm just now
starting to process terabytes of data, so it'll become an issue. Is
iostream slow? specifically I encountered the following example
googling around. The stdio version runs in around 1second, the
iostream version takes 8seconds. Is this just down to a poor iostream
implementation? (gcc 4 on OS X). Or are there reasons why iostream is
fundamentally slower for certain operations? Are there things I should
be keeping in mind to speed up io?
// stdio version
#include <cstdio>
using namespace std;
const int NULA = 0;
int main (void) {
for( int i = 0; i < 100000000; ++i )
printf( "a" );
return NULA;
}
//cout version
#include <iostream>
using namespace std;
const int NULA = 0;
int main (void) {
std::ios_base::sync_with_stdio(false);
for( int i = 0; i < 100000000; ++i )
cout << "a" ;
return NULA;
}
I don't know how you got yours to run in 1 second and 8 second. On my
platform it was taking too long and I reduced the iterations. Here is a
test program I did with results:
#include <ctime>
#include <cstdio>
#include <iostream>
const int interations = 1000000; // 100000000
// stdio version
int mainC (void) {
std::ios_base::sync_with_stdio(false);
for( int i = 0; i < interations; ++i )
printf( "a" );
return 0;
}
//cout version
int mainCPP ()
{
std::ios_base::sync_with_stdio(false);
for( int i = 0; i < interations; ++i )
std::cout << "a" ;
return 0;
}
int main()
{
clock_t start;
clock_t stop;
start = clock();
mainC();
stop = clock();
clock_t ctime = stop - start;
start = clock();
mainCPP();
stop = clock();
clock_t cpptime = stop - start;
std::cout << "C: " << ctime << " C++: " << cpptime << "\n";
std::cout << static_cast<double>( cpptime ) / ctime << "\n";
}
after a bunch of aaaa's...
C: 20331 C++: 23418
1.15184
This is showing the stl to be about 15% slower than the C code.
Microsoft Visual C++ .net 2003
Windows XP Service Pack 2
Unfortunately with my compiler my optimizations are disabled so I don't know
how it would be optimized. But it is not 8x difference.
I would be curious of the output of different compilers. Note that clock()
on microsoft platforms shows total time, not just processing time.
--
Jim Langston
tazmaster@rocketmail.com