[IronPython] Jit leak in defaultdict for Ipy 2.6.2

Idan Zaltzberg idan at cloudshare.com
Mon Nov 29 09:59:20 PST 2010


Thanks.

How I suspect there is a leak in the JIT of my application, up until now I
thought that if the performance counter for "# of methods jitted" is
constantly rising then that means exactly that. From your reply I understand
that this is not the case.

Can you tell how can I know how many uncollectible JIT objects I have so
that I can trace them (preferably without using windbg)



Thanks again…



*From:* users-bounces at lists.ironpython.com [mailto:
users-bounces at lists.ironpython.com] *On Behalf Of *Dino Viehland
*Sent:* Monday, November 29, 2010 7:41 PM
*To:* Discussion of IronPython
*Subject:* Re: [IronPython] Jit leak in defaultdict for Ipy 2.6.2



Defaultdict is creating a new invoke binder – it should be getting the
binder from PythonContext using the Invoke(CallSignature) method.  Because
it creates a new binder each time we are getting no caching of the rules
across defaultdict instances and it’ll end up generating a new method to
handle the missing call.  It is collectible (so not really a leak) but it is
really bad from a performance perspective.



*From:* users-bounces at lists.ironpython.com [mailto:
users-bounces at lists.ironpython.com] *On Behalf Of *Idan Zaltzberg
*Sent:* Monday, November 29, 2010 4:10 AM
*To:* Discussion of IronPython
*Subject:* [IronPython] Jit leak in defaultdict for Ipy 2.6.2



Hi,

I have noticed the following method always adds a jitted method (looking at
the ".NET CLR Jit" performance counter) when it is run:

def f():

                d = defaultdict(int)

                d[0]



I created my own implementation of defaultdict (in ipy):

class defaultdict(dict):

    def __init__(self, cls):

        super(defaultdict, self).__init__()

        self.cls = cls

    def __getitem__(self, key):

        if key not in self:

            self[key] = self.cls()

        return super(defaultdict, self).__getitem__(key)



And I noticed that it does not leak JIT and it works 200 times faster when
running the method f().

Can you please look why this happens in the current implementation?

Also I was wondering if there are any other utility methods that use similar
code and probably will have the same problem.



Thanks,

Idan zalzberg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ironpython.com/pipermail/users-ironpython.com/attachments/20101129/0b258a46/attachment.htm>


More information about the Users mailing list