有没有办法调用具有更好性能结果的C#脚本文件?

我目前使用此方法从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#脚本?

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

以下是我从Oleg Shilo(CS-Script的创建者)得到的答案:

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

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

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

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

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

截图

  • 尝试(如果可能)以避免在执行之间修改脚本。
  • 通过CSScript.CacheEnabled = true使用缓存(默认情况下启用)
  • 对于单个调用,调用的调度样式(Invoke(string methodName))是正常的,但对于多个调用,可以使用GetStaticMethod或更好的AlignToInterface。 性能优势非常显着,因为与所有其他约定相比,Invoke依赖于Reflection。 这是performance.cs示例脚本的分析结果