Here's the simplest version of the fix, it's just updating one file so
properties get their own call sites.
I'll work on a more involved fix that I'll get into 2.1 soon and probably into
2.0.1 a few days later.
Note this diff is from 2.1 but I've updated the names of things that have
changed since 2.0.
File: Descriptors.cs
===================================================================
--- Descriptors.cs;C633889 (server) 12/17/2008 10:43 AM
+++ Descriptors.cs (local) 12/17/2008 10:43 AM
@@ -21,6 +21,10 @@
using IronPython.Runtime.Operations;
using IronPython.Runtime.Types;
+using IronPython.Runtime.Binding;
+using Microsoft.Scripting.Actions;
namespace IronPython.Runtime {
[PythonType]
@@ -92,6 +96,7 @@
[PythonType]
public class PythonProperty : PythonTypeSlot {
private object _fget, _fset, _fdel, _doc;
+ private CallSite<Func<CallSite, CodeContext, object, object, object>>
_getSite;
public PythonProperty() {
}
@@ -177,7 +182,15 @@
public new object __get__(CodeContext/*!*/ context, object instance,
object owner) {
if (instance == null) return this;
- if (fget != null) return PythonCalls.Call(context, fget, instance);
+ if (_getSite == null) {
+ _getSite = CallSite<Func<CallSite, CodeContext, object,
object, object>>.Create(
+ new InvokeBinder(
+ PythonContext.GetContext(context).DefaultBinderState,
+ new CallSignature(1)
+ )
+ );
+ }
+ if (fget != null) return _getSite.Target(_getSite, context, fget,
instance);
throw PythonOps.AttributeError("unreadable attribute");
}
> -----Original Message-----
> From: [email protected] [mailto:users-
> [email protected]] On Behalf Of Kamil Dworakowski
> Sent: Wednesday, December 17, 2008 10:03 AM
> To: Discussion of IronPython
> Subject: Re: [IronPython] weird performance issue
>
> Thanks Dino, it looks like you are right. I print whenever
> _supportAdding == false.
> It happens a lot with the snippet executed, whereas it doesn't happen
> at all with
> the snippet commented out.
>
> We also discovered that the slow down only occurs when we compile code
> to dlls (no _supportAdding == false if runned from sources).
> Still can't come up with a repro though. If you provide us with a
> patch, we can
> test if it solves the problem in our code.
>
> As a short term solution we have removed all the properties from
> decorated functions. This fixed one performance test. We moved to
> other performance tests and we still see that some functions are
> slower when executed from dlls, so the same slow down might be
> triggered by sth else.
>
> On Wed, Dec 17, 2008 at 3:21 AM, Dino Viehland <[email protected]>
> wrote:
> > My guess would be that we're pushing the PythonContext._callSplatSite
> outside of the sweet spot in DLR site caches.
> >
> > You could check this by putting a breakpoint in
> PythonContext.Call(object, params object[]). Then look and see if
> _callSplatSite._rules is an instance of EmptyRuleSet<T> with
> _supportAdding == false.
> >
> > If this is the cause it should be pretty easy to fix - property's
> should probably get their own call site object so it'll be specialized
> to the specific property (maybe we could share a common one of the
> function is a PythonFunction as these generate highly shareable calls
> between multiple function instances). We're also doing a params call
> today which we could stop doing and get a nice perf boost on
> properties.
> >
> >> -----Original Message-----
> >> From: [email protected] [mailto:users-
> >> [email protected]] On Behalf Of Kamil Dworakowski
> >> Sent: Tuesday, December 16, 2008 11:08 AM
> >> To: [email protected]
> >> Subject: [IronPython] weird performance issue
> >>
> >> We see a very strange side effect of running the follwing code on
> the
> >> performance of recalculations in Resolver One.
> >>
> >> def Dumbcorator(fn):
> >> def _inner(self, *args):
> >> return fn(self, *args)
> >> return _inner
> >>
> >> class Locker(object):
> >> @property
> >> @Dumbcorator
> >> def thing(self):
> >> return 2
> >>
> >> l = Locker()
> >> l.thing
> >>
> >> Specifically, one of the performance test reports results 4 to 8
> times
> >> worse with this snippet in than without (the clock is turned on
> after
> >> this snippet executes). If I comment out this snippet from the code,
> >> it suddenly runs 4 to 8 times faster. The fact that I can comment it
> >> out means that it is not used in the test, so it is bizzare that it
> >> slows it down.
> >>
> >> We can't reproduce the slow down in a clean example though. I hope
> >> something clicks for somebody and gives me a hint as to what is
> going
> >> on. Tomorrow I'll continue on trying to minimize the code that is
> >> being slowed down, and hopefully come up with some decent repro.
> >> _______________________________________________
> >> Users mailing list
> >> [email protected]
> >> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> > _______________________________________________
> > Users mailing list
> > [email protected]
> > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> >
> _______________________________________________
> Users mailing list
> [email protected]
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com