#include #include #include #include #include #include #include #include #include struct A { void operator()( int a ) { b = ++a; b = std::cos( b ); } double b; }; struct dummy { void operator()( int a ) { } }; template void test_boost( int s, size_t N ) { T a; typedef boost::signal signal; signal si; for ( int i = 0; i < s; ++i ) si.connect( a ); for ( size_t i = 0;i < N; ++i ) { int t = i %1000; si( t ); } } template void test_sigc( int s, size_t N ) { T a; typedef sigc::signal signal; signal si; for ( int i = 0; i < s; ++i ) si.connect( a ); for ( size_t i = 0;i < N; ++i ) { int t = i %1000; si.emit( t ); } } int main( int argc, char** argv ) { boost::timer ti; int Nslots = std::atoi( argv[1] ); size_t Ncalls = std::atoi( argv[2] )+1; const int ws = 6; const int w = 15; // // with dummy // std::cout << "==================================================================\n" << "call dummy::operator()\n"; std::cout << std::setw( ws ) << "#Slots" << std::setw( w ) << "#Calls" << std::setw( w ) << "boost::signals" << std::setw( w ) << "sigc++-2.0" << std::setw( w ) << "Ratio" << "\n"; for ( size_t s = 0;s < Nslots; ++s ) { for ( size_t i = 100;i < Ncalls; i*=10 ) { std::cout << std::setw( ws ) << s; std::cout << std::setw( w ) << i; ti.restart(); test_boost( s, i ); double b = ti.elapsed(); std::cout << std::setw( w ) << b; ti.restart(); test_sigc( s, i ); double c = ti.elapsed(); std::cout << std::setw( w ) << c; std::cout << std::setw( w ) << b/c; std::cout << "\n"; } } // // with A // std::cout << "==================================================================\n" << "call A::operator()\n"; std::cout << std::setw( ws ) << "#Slots" << std::setw( w ) << "#Calls" << std::setw( w ) << "boost::signals" << std::setw( w ) << "sigc++-2.0" << std::setw( w ) << "Ratio" << "\n"; for ( size_t s = 0;s < Nslots; ++s ) { for ( size_t i = 100;i < Ncalls; i*=10 ) { std::cout << std::setw( ws ) << s; std::cout << std::setw( w ) << i; ti.restart(); test_boost( s, i ); double b = ti.elapsed(); std::cout << std::setw( w ) << b; ti.restart(); test_sigc( s, i ); double c = ti.elapsed(); std::cout << std::setw( w ) << c; std::cout << std::setw( w ) << b/c; std::cout << "\n"; } } }