繁体   English   中英

.NET中的代码的运行时编译,在编译时具有更好的性能

[英]Run-time compilation of code in .net with better performance at compile time

在任何人将此标记为重复之前,请尝试了解我的需要
我有一个用C#ASP.NET MVC5创建的软件,用户基本上可以创建任何公式,否则,切换条件也可能会从我的自定义DLL(包括datediff,DatePart)中包含一些自定义函数。
因此,对于这种情况,我们在MSScriptControl的帮助下使用了VBScript,但是我们决定将C#之类的语法转换为公式。
我已经探索了很多类似CodeDom和Roslyn的方法,但是问题是,要编译10行代码,几乎需要AVG 130毫秒。 后来我也尝试实现比上面两个慢得多的CS-Script,因为它内部使用CodeDOM,Roslyn,MONO作为编译器选项。
现在我正在寻找的是VBScript的替代版本,它几乎需要11毫秒进行编译和执行。

请为这种情况建议我其他任何方式或工具。

如何使用CSharpCodeProvider改善编译时间

 `using Microsoft.CSharp;
  using System;
  using System.CodeDom.Compiler;`

  `namespace abc
  {
   public class Abc
   {
    static void Main()
    {
        var code = @"
   using System;
   namespace First
   {
    public class program
    {
     public static int Main()
     {
        if(Convert.ToDateTime(""01-04-2019 
         10:25:00"")>Convert.ToDateTime(""01-04-2019 15:00:00""))
         {
            return 1;
         }
         else
         {
            return 0;
          }
       }
    }
      }";
        Console.WriteLine(code);
        var options = new CompilerParameters();
        options.GenerateExecutable = false;
        options.GenerateInMemory = false;
        var provider = new CSharpCodeProvider();
        var compile = provider.CompileAssemblyFromSource(options, code);
        var type = compile.CompiledAssembly.GetType("First.program");
        var abc = Activator.CreateInstance(type);`

        `var method = type.GetMethod("Main");
        var result = method.Invoke(abc, null);`

        `Console.WriteLine(result); //output:`
      `}`
  `}`
  `}`

我们在项目中确实遇到了类似的问题。 我们正在生成数百个小型c#文件,并逐个编译它们以从每个文件中获得一个功能(实际上,该文件位于内存中,因此我们不受IO限制)。

该操作很慢,我们尝试了很多方法来提高吞吐量(更新Roslyn,更改选项等)。 我们发现开始编译时会产生一些开销,该开销与其中隐含的代码量不是线性的。

到目前为止,我们的最终解决方案是我们拥有的最好的解决方案(但是如果有人有更好的主意,我们将不胜感激):组编译。 一次调用多个文件的编译器比多次调用相同数量的文件要快得多。

在您的情况下,我的建议是:将所有功能归为一组并立即进行编译。 如果您有1000个功能,则单个功能100ms会很痛苦,但1000个功能1s可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM