2013-10-09 53 views
3

我正在寻找将代码的某些基于反射的部分替换为使用动态运行时编译更好地执行的部分。环顾四周,我看到的是单声道和微软有单独的编译器作为一种服务解决方案:Mono.CSharpMicrosoft.CSharpC#编译器即服务:Mono.CSharp vs Microsoft.CSharp

随着提出基于意见的问题的风险,我想知道这两个比较如何?我从一个非常肤浅的初步调查中可以看出,他们通常都提供CAAS功能。我能够使用Microsoft.CSharp编译“Hello World”类并执行它。虽然我没有做同样的事情用一个单尚,我假设它可以做同样的。

有没有人有任何经验或两者都可以评论这个问题?


编辑:我不是问的Mono的C#和微软的C#的比较 - 大家都已经熟悉并同时使用。这个问题特别是关于两个解决方案。

CAAS不是(现在还是).NET运行时的一个标准部分,即没有System.Compile命名空间。将两种溶液Mono.CSharpMicrosoft.CSharp是C#单独非标准CAAS解决方案。他们的界面非常不同,因此也是一个问题。

Mono's compiler service

Microsoft's compiler service


编辑#2:完全忘了Roslyn(感谢@Lex Li

+0

@nvoigt,我不认为它是重复的,因为你提供的链接的标题是误导性的,并不是真正的问题。 –

+0

这不是重复的,我对标题不太了解。查看我的更新。 –

+0

@AmirAbiri哦,好的,这清除了它。 – nvoigt

回答

3

Microsoft.CSharp,因为它是现在(.NET 4.5)使用API由C#编译器为C#动态表达式发出绑定。因此它是C#编译器,但非常有限。同样的API(DLL)由两个.NET和Mono实现的,所以你可以编译在.NET和Mono上,反之亦然运行。

Mono.CSharp是Mono C#编译器的评估者风格API。它可以让你编译任何C#文本类代码(表达式,声明,类型声明等),并执行它。它严重依赖于System.Reflection和System.Reflection.Emit。

这些都不具有任何关系CodeDom中。

+0

性能如何?我最初的测试表明,使用'Microsoft.CSharp'编译的代码与静态编译的代码完全相同(当我理解它后面的代码时,这是预期的)。接下来我将在'Mono.CSharp'上运行相同的测试。你在这方面有什么经验? –

+0

由Microsoft.CSharp生成的代码可以认为与批处理编译器的输出相同。它在场景IL后面生成,与任何其他IL代码一样被JIT编辑 –

0

那么我现在已经比较了Mono.CSharpMicrosoft.CSharp,结果就是Mono的版本比较糟糕。

我编译下面的代码与两个动态编译器:

using System; 
using CompilerServiceTest; 

public class LalaDynamicImpl : ILala 
{ 
    private static int _counter; 

    public void DoLala() 
    { 
     _counter++; 
    } 
} 

主要程序会沿着线的东西:

public interface ILala 
{ 
    void DoLala(); 
} 

public class LalaStaticImpl : ILala 
{ 
    private static int _counter; 

    public void DoLala() 
    { 
     _counter++; 
    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Message("Compiling dynamic lala..."); 
     var lala = BuildDynamicLala(); 

     Message("Testing dynamic lala..."); 
     Test(lala); 

     Message("Sleeping for 1s..."); 
     GC.Collect(); 
     Thread.Sleep(1000); 

     Message("Testing static lala..."); 
     Test(new LalaStaticImpl()); 
    } 

    private static void Test(ILala lala) 
    { 
     var watch = Stopwatch.StartNew(); 
     for (var i = 0; i < 1000000000; i++) 
      lala.DoLala(); 
     Console.WriteLine(watch.Elapsed); 
    } 
} 

在我的机器的结果是:

  • 静态编译的类:1.9s
  • 动态编译类编译Microsoft.CSharp1.9s
  • 动态编译类编译Mono.CSharp10S

结果与对应什么Mono团队提到here什么马立克萨法尔提到在他的answser - Microsoft.CSharp编译器服务是实际编译器的包装器,代码按照与正常代码相同的方式进行编译和优化。 Mono.Csharp编译器服务与Mono编译器分开,更像是一个“eval”机器。它不像标准编译器那样优化代码。

基本上它看来,单声道编译器服务是不是真的用于性能关键场景,但对于丰富的功能,学习,测试等

测试了Windows 7的64位计算机上使用.NET 4.0( VS 2010)和Mono 3.2.3。