0

我目前正在使用此方法从 Visual Studio 2010 中的 C# 应用程序调用 C# 脚本文件 ( http://www.csscript.net ):

var script = new AsmHelper(CSScript.Load(
             @"C:\temp\CSScriptTest\CSScriptTest\cstest.cs"));
script.Invoke("*.LoopTest");

但我注意到这方面的性能大约是使用此方法调用类似 IronPython 脚本所需的两倍:

var ironPythonRuntime = Python.CreateRuntime();
dynamic loadPython = ironPythonRuntime.UseFile(
                     @"C:\temp\IronPythonTest\IronPythonTest\pytest.py");
loadPython.LoopTest();

有没有一种方法可以调用性能更好的 C# 脚本?

4

2 回答 2

1

这是另一种选择;我实际上并不知道 CS-Script 的性能如何,所以我无法比较它们,但是您可以使用CompilerParameters.GenerateInMemoryCodeDomProvider.CompileAssemblyFromFile 方法,然后调用它。GenerateInMemory 就像它所说的那样,在进程的内存中生成程序集,而不是将其写入磁盘。您也可以使用 CompileAssemblyFromSource 并使用流式阅读器来读取 .cs 文件中的所有内容。

于 2012-08-21T20:09:00.773 回答
1

这是我从 Oleg Shilo(CS-Script 的创建者)那里得到的答案:

实际上,性能是使用 CS-Script 的强项。

在性能方面,重要的是要记住 IronPython 和 CS-Script 执行模型之间的区别。CS-Script(以及 Boo)依赖于 CLR,它在执行之前编译脚本,IronPython 依赖于 DLR,它在执行期间解释脚本。

因此,使用 CS-Script 脚本总是会产生一些与脚本编译相关的启动开销。然而,在脚本加载(编译)后,CS-Script 展示了托管代码的最佳性能。这是因为在运行时脚本不再是脚本而是普通程序集,性能与非脚本场景相同。因此,如果您的测试中有多个 LoopTest 调用,那么性能“图片”将非常不同:加载和第一个 LoopTest 调用将相对较慢,但 LoopTest 的后续调用将闪电般快速。

为了帮助解决启动开销,CS-Script 使用缓存机制(默认启用),如果自上次执行后脚本未更改,则不会再次重新编译,但会重用先前的编译结果。

因此,为了获得最佳性能:

截屏

  • 尝试(如果可能)避免在执行之间修改脚本。
  • 通过 CSScript.CacheEnabled = true 使用缓存(默认启用)
  • 调用的调度风格 (Invoke(string methodName)) 对于单个调用是可以的,但对于多个调用,使用 GetStaticMethod 甚至更好的 AlignToInterface。与所有其他约定相比,Invoke 依赖于反射,因此性能优势非常显着。这是 performance.cs 示例脚本的分析结果
于 2012-08-30T14:36:13.320 回答