单声道项目:为什么单声道比.NET更快?

我很惊讶地发现mono比.NET快。 有谁知道这是为什么? 我期待单声道比.NET慢,但至less在我的实验情况下。

我有一个与.NET框架的Windows XP的笔记本电脑。 我在Windows XP上运行vmware vmplayer上的CentOS。 我想尝试单声道。 于是抓住了Mono 2.6.1的源代码并将其安装在vmplayer的CentOS上。 我写了一个testingweb服务应用程序使用.net 2.0执行它的wndows,它的工作,我把二进制到vmplayer中的centos没有任何重新编译,并在centos上执行它。 万岁,它的工作! 生活是好的,但其他的东西引起了我的注意。 在centos上执行应用程序似乎更快。 我不相信我的眼睛。

为了证实我的观察,我将networking排除在等式之外,因为networking响应取决于很多外部因素。

我从互联网上抓起了一个小的虚拟循环代码,编译成在windows和CentOS中执行的visual studio,结果如下

Output on windows console is HelloConsole\bin\Debug>HelloConsole.exe Result =2.66666664666712E+24 37443.6077769661 ms Output on Centos console is [rupert@bagvapp Math.Pow]$ mono HelloConsole.exe Result =2.66666664666712E+24 28790.6286 ms 

如果任何人都可以解释这种行为,那就太好了。 我的外行人的理解是Mono的实现比.NET框架更有效率。 即使我假设Mono的Math实现只是有效的。 但像处理财务数据,graphics计算等很多实现都依赖于math库。 在没有vmware的情况下直接在Mono / Centos上执行testing会更有趣,但这需要一些时间。 下周末我会试一试。

 public static void DummyLoop() { double sumOfPowers = 0; int count = Convert.ToInt32(ConfigurationManager.AppSettings["count"]); for (int i = 0; i < count; i++) { sumOfPowers += Math.Pow(i, 2); } Console.WriteLine("Result =" + sumOfPowers); } static void Main(string[] args) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); DummyLoop(); stopWatch.Stop(); double ms = (stopWatch.ElapsedTicks * 1000.0) / Stopwatch.Frequency; Console.WriteLine(string.Concat(ms.ToString(), " ms")); Console.ReadLine(); } 

Mono邮件列表上的这个讨论不是很久以前。 他们提供的理由是Mono在Linux下非常优化(究竟是怎么没有提到)。 但是Mono并不是这里唯一的variables,如果你在Linux上运行Mono的话。 这是一个不同的操作系统,不同的进程调度器和各种内核级别的子系统可以对性能产生显着不同的影响,独立于Mono团队的工作。 单声道也大量使用编译器内在函数 ,.NET可能会或可能不会。

然而,大多数时候在Windows上的Mono与.NET上的Windows比较,你可能会发现.NET更频繁地击败Mono。 但即使如此,单声道也不一定会输。 事实上,对于专门为Mono进行优化的代码(例如:使用Mono.SIMD),无论平台如何,您在Mono vs .NET上都可以获得更好的性能。

你在这里并没有真正做出比较。 你基本上比较了两者之间的一个函数(Math.Pow)。 据推测,真正的应用程序将做比这一个function更多的东西。

Mono的Math.Pow看起来是通过在C中实现来优化的。我不知道.Net如何实现它。 它可以在托pipe代码中完全实现。

可能你会发现两个运行时间足够快,以满足每一天的需求。

所有这些真正testing的是定时器的实现 – 这通常是不好的testing,因为没有两个操作系统实现相同。 有些人使用非常精确的硬件计时器(Linux),有些计时器的计时器不能根据系统需要被抢占(Windows)。 如果你想对一个呼叫进行基准testing,你可以避免中间呼叫,或者你可能不是在计算他们正在testing的内容。 math计算在两个平台上将会几乎相同,因为计算它的math在一百年内没有改变。 我学习与定时器的操作系统差异比什么都重要。

那么,我并不感到惊讶,它执行相同的字节码更快。

如果您尝试使用Windows版本的Mono,那么除了涉及SIMD优化操作的情况之外,我会期望性能差异较小。