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

时间:2012-08-21 19:15:35

标签: c# visual-studio-2010 ironpython

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  

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

     

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

     

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

     

协助启动开销CS-Script正在使用缓存   机制(默认启用),如果脚本未更改,则自   最后一次执行它不会再次重新编译,而是之前的   编译结果被重用。

     

因此,为了获得最佳表现:

     

screenshot

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