我很惊讶地发现mono比.NET更快.有谁知道为什么会这样?我期待单声道比.NET慢,但至少我的实验并非如此.
我有一个带有.NET框架的windows xp笔记本电脑.我在windows xp上运行vmware vmplayer上的CentOS.我想尝试单声道.因此抓住了Mono 2.6.1源并将其安装在vmplayer的CentOS上.我已经编写了一个测试web服务应用程序,使用.Net 2.0在wndows上执行它,它工作,我将二进制文件转移到vmplayer中的centos,没有任何重新编译,并在centos上执行它.华友世纪有效!生活是美好的,然后别的东西吸引了我的注意力.在centos上执行应用程序似乎更快.我不相信自己的眼睛.
为了证实我的观察结果,我将网络排除在外,因为网络响应取决于很多外部因素.
我从互联网上抓取了小的虚拟循环代码,在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的数学实现只是有效的.但是很多像处理财务数据,图形计算这样的实现很大程度上依赖于数学库.在没有vmware的情况下直接在Mono/Centos上执行测试会更有趣,但这需要一些时间.我会试试下周末.
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(); }
joemoe.. 59
不久前,这是关于Mono邮件列表的讨论.他们提供的推理是Mono在Linux下极为优化(具体怎么没有提到).但是如果你在Linux上运行Mono,Mono并不是唯一的变量.它是一个不同的操作系统,不同的进程调度程序和各种内核级子系统可以对性能产生明显不同的影响,与Mono团队的工作无关.Mono也大量使用编译器内在函数,.NET可能会也可能不会.
但是,大多数情况下,Windows上的Mono与Windows上的 .NET比较,您可能会发现.NET更频繁地击败Mono而不是.但即便如此,Mono可能也不会总是失败.事实上,对于专门针对Mono优化的代码(例如:使用Mono.SIMD),无论使用何种平台,您都可以在Mono vs .NET上获得更高性能的数量级.
不久前,这是关于Mono邮件列表的讨论.他们提供的推理是Mono在Linux下极为优化(具体怎么没有提到).但是如果你在Linux上运行Mono,Mono并不是唯一的变量.它是一个不同的操作系统,不同的进程调度程序和各种内核级子系统可以对性能产生明显不同的影响,与Mono团队的工作无关.Mono也大量使用编译器内在函数,.NET可能会也可能不会.
但是,大多数情况下,Windows上的Mono与Windows上的 .NET比较,您可能会发现.NET更频繁地击败Mono而不是.但即便如此,Mono可能也不会总是失败.事实上,对于专门针对Mono优化的代码(例如:使用Mono.SIMD),无论使用何种平台,您都可以在Mono vs .NET上获得更高性能的数量级.
你在这里做的不是很多.您基本上比较两者之间的一个函数(Math.Pow).据推测,真正的应用程序将比这一个功能做更多的事情.
Mono的Math.Pow看起来是通过在C中实现这个来优化的.我不知道.Net如何实现它.它可以在托管代码中完全实现.
可能你会发现两个运行时都足够快,可以满足每一天的需求.