调试启用时外部模块的IronPython性能较差

时间:2011-05-31 04:37:47

标签: .net performance ironpython ironpython-studio

在尝试导入和使用SymPy时,我在VS2010内部遇到IronPython的一些性能问题。

我有一个包含以下代码的IronPython测试项目:

import time

print 'StandaloneIronPython'

startTime = time.time()
from sympy import *
importTime = time.time() - startTime
print 'Import time = %f' % importTime

startTime = time.time()
for x in (x/10.0 for x in xrange(-100,100)):
    (x**2-2*x)
numericsTime = time.time() - startTime
print 'Basic numerics time= %f' % numericsTime

startTime = time.time()
for x in (x/10.0 for x in xrange(-100,100)):
    N(x**2-2*x)
sympyTime = time.time() - startTime
print 'SymPy time = %f' % sympyTime

raw_input('Press enter to continue...')

SymPy已下载并安装为鸡蛋;我的“IronPython 2.7 \ Lib \ site-packages”文件夹位于项目搜索路径中。

如果我通过“Debug> Start Debugging”运行程序,我会得到大概的结果:

StandaloneIronPython
Import time = 12.090019
Basic numerics time= 0.015594
SymPy time = 2.230804
Press enter to continue...

但是,如果我通过“Debug> Start Without Debugging”运行程序,我得到大约:

StandaloneIronPython
Import time = 2.199600
Basic numerics time= 0.015602
SymPy time = 0.140404
Press enter to continue...

我得到的速度是导入速度的5倍,并且是运行速度的10倍。

那么如果IronPython花费所有时间调试库代码,我如何才能获得良好的性能呢?

  • 有没有办法可以将SymPy捆绑为库,程序集或其他类似的东西,以便它能够快速执行?
  • 有没有办法告诉VS2010不要调试SymPy的代码?
  • 还有其他一些解决方案吗?

1 个答案:

答案 0 :(得分:0)

每当你看到在运行和不运行调试器之间存在很大的性能差异时,通常是因为你的应用程序产生了大量调试器必须处理的事件。

最常见的例子是例外情况。如果SymPy在初始化期间抛出并捕获大量异常,则每个异常都会导致调试器的往返(即使它被处理),导致大幅减速。

您可以通过转到“Debug> Exceptions ...”来验证这一点,检查“Common Language Runtime Exceptions”旁边的“Thrown”框并重新运行该应用。如果你停止数以百计的例外,那就是你的问题。

如果这确实是你的问题,遗憾的是它没有一个好的解决方法。将Python代码预编译为.dll不会阻止抛出这些异常。