[PyQt] Re: Serious performance problem with sipQtFindConnection
phil at riverbankcomputing.co.uk
Mon Sep 17 19:45:23 BST 2007
On Monday 17 September 2007, Giovanni Bajo wrote:
> Hi Phil,
> after some days/weeks of debugging/profiling some code without really
> getting any clue at the Python level, I tried oprofile on the code, and
> was shocked by sipQtFindConnection being shown as top entry (50% of the
> total time spent in that execution, with total execution time being 32
> seconds on my PC; so it's about 16 seconds spent in that function only).
> By doing some further research, it looks like the offending call is in
> sipWrapper_clear() (called from sipWrapper_dealloc()). For each SIP
> object destroyed, sipQtFindConnection is invoked, and it goes through a
> linear search of all connections.
> Since I have many small objects wrapped with SIP (which I allocate and
> deallocate galore), I can see this taking a lot of time.
> I am a little concerned because the code I'm profiling isn't Qt-related
> at all: it uses my own SIP objects, but not Qt. sipQtFindConnection
> seems more a bridge between SIP and Qt signal/slot, and it's a pity that
> all SIP objects in a program must pay this penalty (even those not
> related to Qt at all).
> I was wondering if something could be done in this regard. I can help
> with the coding leg-work, but I need some inputs as what can be tried to
> fix this.
> Thanks in advance!
The code is checking to see if any of the instance's methods are currently
connected as a slot. This can apply to any wrapped class, including non-Qt
Can you instrument the code in qobject.sip to count the different calls
to "new PyQtProxy()" - there are 3 different places I think. Then display the
3 counts when things start to go wrong.
One possible solution would be to keep the proxy instances used as slots in a
separate list - but only if that count is low.
Another solution would be to maintain a flag in the sipWrapper that is set if
the instance might have a connected method and only search if the flag is
Obviously there are other solutions, but the counts should point us in the
More information about the PyQt