好吧,我现在进行了比较,结果是 Mono 的版本与之相比表现不佳Mono.CSharp
。Microsoft.CSharp
我用两个动态编译器编译了以下代码:
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.CSharp
时间:1.9s
- 动态编译类编译
Mono.CSharp
时间:10s
结果与 Mono 团队在这里提到的内容以及 Marek Safar 在他的回答中提到的内容一致 -Microsoft.CSharp
编译器服务是实际编译器的包装器,并且代码的编译和优化方式与普通代码相同。Mono.Csharp
编译器服务与 Mono 编译器是分开的,更像是一个“eval”机器。它不会以与标准编译器相同的方式优化代码。
基本上,Mono 编译器服务似乎并不真正适用于性能关键场景,而是适用于丰富的功能、学习、测试等。
在具有 .NET 4.0 (VS 2010) 和 Mono 3.2.3 的 Windows 7 64 位机器上进行了测试。