Re: To go with Go or C/C++?
On Tue, 7 May 2013 22:41:49 +0200
Melzzzzz <mel@zzzzz.com> wrote:
On Fri, 3 May 2013 10:46:39 -0700 (PDT)
=C3=96=C3=B6 Tiib <ootiib@hot.ee> wrote:
Output with Visual studio 2010 (run it *without* debugging otherwise
it heavily hooks itself to exceptions):
With if it took 921 msec; (sum 197990000)
With try it took 782 msec; (sum 197990000)
So 17% better performance thanks to replacing 200 ifs in cycle with
one try/catch.
With more realistic example:
bmaxa@maxa:~/examples$ cat module.cpp
#include <cstring>
#include <stdexcept>
bool checkThingsWithIf( int param, char* error, unsigned errsz )throw()
{
if( param % 10000 == 0)
{
strncpy(error,"some error",errsz);
return false;
}
return true;
}
void checkThingsWithTry( int param )
{
if ( param % 10000 == 0 )
{
throw std::runtime_error("some error");
}
}
bmaxa@maxa:~/examples$ cat tryif.cpp
#include <cstdio>
#include <ctime>
#include <exception>
int ms_elapsed( clock_t start, clock_t stop )
{
return static_cast<int>( 1000.0 * ( stop - start ) / CLOCKS_PER_SEC=
);
}
bool checkThingsWithIf( int param, char* error,unsigned errsz )throw();
void checkThingsWithTry( int param );
int testWithIf( int param )
{
int ret;
char buf[256];
for ( int j = 0; j < 200; ++j )
{
if ( !checkThingsWithIf( param+j,buf,sizeof buf ) )
{
return ret;
}
++ret;
}
return ret;
}
int testWithTry( int param )
{
int ret;
try
{
for ( int j = 0; j < 200; ++j )
{
checkThingsWithTry( param+j );
++ret;
}
}
catch (const std::exception& )
{ }
return ret;
}
void benchmark( int (*foo)(int), const char* label)
{
clock_t volatile start;
clock_t volatile stop;
int volatile sum;
start = clock();
sum = 0;
for ( int i = 0; i < 1000000; ++i )
{
sum += (*foo)( i );
}
stop = clock();
printf( "%s it took %d msec; (sum %d)\n", label,ms_elapsed( start,s=
top) , sum );
}
int main( int argc, char* argv[] )
{
benchmark( &testWithTry,"With try");
benchmark( &testWithIf,"With if");
}
bmaxa@maxa:~/examples$ g++-trunk -c -O2 module.cpp -o module.o
bmaxa@maxa:~/examples$ g++-trunk -O2 tryif.cpp module.o -o tryif
bmaxa@maxa:~/examples$ ./tryif
With try it took 340 msec; (sum 197990000)
With if it took 410 msec; (sum 197990000)
bmaxa@maxa:~/examples$ g++-trunk -c -O1 module.cpp -o module.o
bmaxa@maxa:~/examples$ g++-trunk -O1 tryif.cpp module.o -o tryif
bmaxa@maxa:~/examples$ ./tryif
With try it took 490 msec; (sum 197990000)
With if it took 510 msec; (sum 197990000)
bmaxa@maxa:~/examples$ g++-trunk -c -O0 module.cpp -o module.o
bmaxa@maxa:~/examples$ g++-trunk -O0 tryif.cpp module.o -o tryif
bmaxa@maxa:~/examples$ ./tryif
With try it took 870 msec; (sum 1525529904)
With if it took 860 msec; (sum 1525529904)
Seems that exceptions win when throwing exception
objects instead of filling error buffer;)