boost::signal performance

Timings retrieved on Pentium4 3.2Ghz

g++ version: 4.4.2-9 debian
boost 1.40.0-6 debian
sigc: 2.2.4.2-1 debian

flags: -O3 -march=native

Class CCallback definited as:

class CCallback {
public:
virtual ~CCallback() {}
virtual void operator() () = 0;
};

Single connection (single call) benchmark

    Time Flexibility Native
Multicast
object size

Reference
(direct call and for cicle)

foo();
2.9ns Low
0 bytes
Function pointer
void (* proc)(void);
3.9ns Medium
4 bytes
callback class
class CPtrFunCallback: public CCallback {
void (* m_proc)(void);
public:
CPtrFunCallback( void (* proc)(void) ) : m_proc(proc) { }
virtual ~CPtrFunCallback() {}
virtual void operator() () {m_proc(); }
};
7.7ns Hi no
4Bytes + 8 bytes (HEAP) + N vtable
callback class (template)
template<void (* T)(void)>
class TPtrFunCallback: public CCallback {
public:
virtual ~TPtrFunCallback() {}
virtual void operator() () { T(); }
};
6.5ns Hi no
4Bytes + 4 bytes (HEAP) + NxM vtable
boost::function
boost:function<void ()>
12.9ns
Hi
no
16 bytes
4xN Additional Fn, 1 typeinfo if boost::bind is used
boost::signal
boost::signal<void ()>
200.0ns Very Hi yes
20 bytes + 322 bytes (HEAP) + ?
sigc::signal
sigc::signal<void>
136.8ns Very Hi yes
8 bytes + 96 bytes (HEAP) + temporary 16 bytes (HEAP) per call

Additional Consideration

boost::function

using boost::bind RTTI is required:
08048750 V typeinfo for boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > >
08048760 V typeinfo name for boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > >

080485e0 W boost::detail::function::functor_manager<boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > >, std::allocator<void> >::manage(boost::detail::function::function_buffer const&, boost::detail::function::function_buffer&, boost::detail::function::functor_manager_operation_type)
08048540 W boost::detail::function::has_empty_target(...)
080485b0 W boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > >, void>::invoke(boost::detail::function::function_buffer&)
08048550 W void boost::function0<void, std::allocator<void> >::assign_to<boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > > >(boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > > const&)
08048748 V void boost::function0<void, std::allocator<void> >::assign_to<boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > > >(boost::_bi::bind_t<void, boost::_mfi::mf0<void, MyFoo>, boost::_bi::list1<boost::_bi::value<MyFoo*> > > const&)::stored_vtable