boost::signal performance

Timings retrieved on Pentium4 3.2Ghz

g++ version: 4.2.3-3 debian
boost 1.34.1-11 debian
sigc: 2.0.18-2 debian

flags: -O2

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();
4.0ns Low
0 bytes
Function pointer
void (* proc)(void);
4.2ns 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(); }
};
8.0ns 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(); }
};
5.7ns Hi no
4Bytes + 4 bytes (HEAP) + NxM vtable
boost::function
boost:function<void ()>
12.0ns
Hi
no
16 bytes
4xN Additional Fn, 1 typeinfo if boost::bind is used
boost::signal
boost::signal<void ()>
217.6ns Very Hi yes
20 bytes + 322 bytes (HEAP) + ?
sigc::signal
sigc::signal<void>
169.7ns 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