|
Boost : |
From: Arno Wilhelm (arno.wilhelm_at_[hidden])
Date: 2005-12-21 04:54:44
Hello,
Have modified your example a bit and tried it out on my linux machine (fedora core 3) and the performance seems to be even worse.
I use boost 1.32 (1.32.0-5.fc3) and gcc-Version 3.4.4 20050721 (Red Hat 3.4.4-2) on a Intel Pentium 4 CPU 3.00GHz with 2048 kb cache.
# When I compile it with optimization I typically get these values:
> g++ -O3 -o signal_test main.cc -lboost_signals
> ./signal_test
Iterations: 10000000
SIGNALS: sec.: 56 / usec.: 295077
BOOST::FUNCTION: sec.: 0 / usec.: 176564
FUNCTION POINTER: sec.: 0 / usec.: 41502
# Without optimization it looks like this:
> g++ -o signal_test main.cc -lboost_signals
./signal_test
Iterations: 10000000
SIGNALS: sec.: 70 / usec.: 26187
BOOST::FUNCTION: sec.: 0 / usec.: 244619
FUNCTION POINTER: sec.: 0 / usec.: 53574
And I always thought signals ought to be fast :-).
Here is the code I used for the test:
------------------------------- snip -------------------------------
#include <boost/function.hpp>
#include <boost/signals.hpp>
#include <iostream>
#include <sys/time.h>
using namespace std;
void do_nothing()
{
}
int main()
{
unsigned int counter = 0;
const unsigned int MAX_ITERATION = 10000000;
struct timeval t_start;
struct timeval t_end;
boost::function<void (void)> f = do_nothing;
void (*pf)(void) = &do_nothing;
boost::signal<void (void)> s;
s.connect(&do_nothing);
cerr << "\nIterations: " << MAX_ITERATION << endl << endl;
cerr << "SIGNALS: ";
gettimeofday( &t_start, 0 );
for( counter = 0; counter < MAX_ITERATION; ++counter )
{
s();
}
gettimeofday( &t_end, 0 );
cerr << "sec.: " << ( t_end.tv_sec - t_start.tv_sec ) << " / usec.: " << ( t_end.tv_usec - t_start.tv_usec ) << endl;
cerr << "BOOST::FUNCTION: ";
gettimeofday( &t_start, 0 );
for( counter = 0; counter < MAX_ITERATION; ++counter )
{
f();
}
gettimeofday( &t_end, 0 );
cerr << "sec.: " << ( t_end.tv_sec - t_start.tv_sec ) << " / usec.: " << ( t_end.tv_usec - t_start.tv_usec ) << endl;
cerr << "FUNCTION POINTER: ";
gettimeofday( &t_start, 0 );
for( counter = 0; counter < MAX_ITERATION; ++counter )
{
pf();
}
gettimeofday( &t_end, 0 );
cerr << "sec.: " << ( t_end.tv_sec - t_start.tv_sec ) << " / usec.: " << ( t_end.tv_usec - t_start.tv_usec ) << endl;
return 0;
}
------------------------------- snip -------------------------------
regards,
Arno
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk