[IronPython] IPy2b5 Performance

Curt Hagenlocher curt at hagenlocher.org
Tue Oct 7 17:40:11 CEST 2008


Every time you call sort, we create a new call site object which needs to be
spun up.  So your test is really an absolute worst-case as far as
performance goes.  Is it actually reflective of the circumstances under
which you do sorting, where the number of sorts vastly exceeds the size of
each sort?

We could reuse the sort call site instead of creating a new one for each
sort, but that comes with its own problems.

Exceptions are relatively slow in the CLR, which is why it's best to use
them only for actual exceptions and not for the failure path of a
comparison.  In the example you give, the "best" code is probably
"getattr(obj, 'prop', 0)".

On Tue, Oct 7, 2008 at 8:15 AM, Asaf Kleinbort <asaf at itstructures.com>wrote:

>  Hi all,
>
> I am investigating performance problems we have when running our code using
> IPy2b5 (comparing to IPy 1.1.1).
>
> Found two interesting issues:
>
> 1.       It seems that there is some bug in the 'sort' method
>
> Running the following code:
>
>
>
> from System import DateTime
>
> def test():
>
>     s = DateTime.Now
>
>     for i in xrange(100000):
>
>         a = [1,4,7,6,10,6]
>
>         a.sort()
>
>     return (DateTime.Now - s).TotalMilliseconds
>
>             print test()
>
>
>
> we get 3900% (!) degradation between IP1 and IPy2b5:  In IPy 1 the code
> runs in *390ms* and in IPy2b5: *15281ms*
>
>
>
> 2.This is probably already known:  there is a major difference in
> performance between an if/else block and a try/catch one:
>
>         def func1(obj):
>
>             try:
>
>                 return obj.prop
>
>             except:
>
>                 return 0
>
>
>
>                  def func2(obj):
>
>             if hasattr(obj,'prop'):
>
>                 return obj.prop
>
>             else:
>
>                 return 0
>
>
>
>         def test(s):
>
>                      for i in xrange(100000):
>
>                 x = func1(set())
>
>             return (DateTime.Now -s).TotalMilliseconds
>
>
>
>         def test2(s):
>
>             for i in xrange(10000):
>
>                 x = func2(set())
>
>             return (DateTime.Now -s).TotalMilliseconds
>
>
>
>                  print test(DateTime.Now)
>
>                  print test2(DateTime.Now)
>
> *                *
>
> Results for IPy1 and IPy2b5 are similar ~3000ms for 'test' and ~15ms for
> 'test2'. Using if/else is 200 times quicker.
>
> In Cpython it is only 2 times quicker.
>
>
>
> We can bypass the second issue in our code, but the first one is harder to
> ignore…
>
> Are these issues already known? Any ideas?
>
> Thanks,
>
> Asaf**
>
>
>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20081007/02bb7d92/attachment.html>


More information about the Ironpython-users mailing list