2011-02-08 133 views
1

我正在做一些IronPython 2.6.1和clr.CompileModules函数的实验,以将我的大脚本编译为程序集。测试已经显示出良好的冷启动性能性能改进,但在某些情况下,导入编译模块实际上比在某些情况下执行代表我的代码的大字符串要慢。编译代码的IronPython导入性能

我的问题是,如果我使用像

scope.Engine.Execute(string.Format("from {0} import {0}", theModule), scope); 

ImportModule功能,即使我得到一个新的ScriptSCope回做的DLR缓存的进口在其他ScriptScopes做?所以如果模块1和模块10导入相同的类型,我只需要一次性能命中?

正在使用clr.CompileModules优于scope.Compile()?我的理解是即时编译是有用的,如果我不想管理额外的程序集并且只想支付一次编译成本。

回答

1

DLR不会缓存导入,但IronPython会。

我认为你的理解是正确的 - clr.CompileModules通常对于启动优势很有好处。你也可以将它与装配相结合,你会有更好的启动性能。如果你还没有这样做,那么这可能是你有时看到性能更差的原因 - 我们可以通过首先解释代码来编译代码时避免JIT,但是如果编译我们总是需要JIT。编译+ ngen是两个世界中最好的,除了需要设置所有这些。

+0

谢谢,我一直在应用程序上运行dotTrace,切换到已编译的IronPython代码,看起来像是冷启动性能的前进方向。不过,我仍然在ImportModule中花费大量时间。我有一个包含29个模块的程序集,我在同一个范围内运行“from foo import bar”,然后将该类的变量提取到C#中以供使用。减少导入依赖关系这些模块减少了导入时间是模块本身的导入时间? – 2011-02-09 04:13:31