我目前正在使用此方法从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#脚本?
答案 0 :(得分:1)
这是另一种选择;我实际上并不知道CS-Script的性能是什么,因此我无法对它们进行比较,但您可以将CompilerParameters.GenerateInMemory与CodeDomProvider.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正在使用缓存 机制(默认启用),如果脚本未更改,则自 最后一次执行它不会再次重新编译,而是之前的 编译结果被重用。
因此,为了获得最佳表现:
- 尝试(如果可能)以避免在执行之间修改脚本。
- 通过CSScript.CacheEnabled = true(默认启用)
使用缓存- 调用的调度方式(Invoke(string methodName))对于单个调用是可以的 呼叫,但多次呼叫使用GetStaticMethod甚至更好 AlignToInterface。性能优势非常显着 调用与所有其他约定形成对比依赖于 反射。这是performance.cs示例的分析结果 脚本