Re: [sigc] [performance] slot_base::empty



Hi!

This behaviour is indeed not what I would expect. slot_base::empty() is an inline function that simply checks up to two pointers for 0:

inline bool empty() const    { return (!rep_ || !rep_->call_); }

So, if your app spends half of its time in slot_base::empty() it must be called millions of times!

From what you write below, the calls to slot_base::empty() seem to come from signal_impl::sweep() which gets executed when slots are (auto-) disconnected or destroyed during signal emission. signal_impl::sweep() iterates through the signal's slotlist to remove slots that have been disconnected (so it's O(N)).

My only explanation for the experienced behaviour is that you have a signal with _lots_ of slots connected and that you repeatedly emit the signal and connect/disconnect slots during signal emission. Without further information about your code, however, it's hard to give some advice how to improve the situation.

Maybe it's also possible to optimize signal_impl::sweep(). The difficulty is that the signal's slot list should not be changed during signal emission. Otherwise things either get to complicated or the performance of signal::emit() suffers.

Regards,

 Martin


Am 16.02.2005 17:23:14 schrieb(en) Neal E. Coombes:
I've converted our system from using an old fashioned observer
pattern
to using signals.  For the most part everything performs well, but
there
is one feature that seems to take minutes instead of seconds now.

I compiled my app for profiling and ran it for 22 minutes repeatedly
exercising this feature.  At the top of my gprof output is
slot_base::empty taking 49.3% of my applications run time (being
called
400 million times).

I optimized the app and repeated the above.  In this version at the
top
of my gprof output is signal_impl::sweep taking 50.46% of my
application
run time (being called 30 million times).

My question:  What kinds of improper use of sigc could be causing
this
(so I might remove any such cases)?  On the other hand is there
anything
I might be able to do in sigc to reduce the number of times sweep
calls
empty?  or perhaps reduce the number of times sweep is called all
together?

Any and all insights much appreciated.

Thanks,
Neal

_______________________________________________
libsigc-list mailing list
libsigc-list gnome org
http://mail.gnome.org/mailman/listinfo/libsigc-list






[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]