c# - 单声道项目 : Why is mono faster than . NET?

标签 c# .net mono

我惊讶地发现 mono 比 .NET 更快。有谁知道为什么会这样?我原以为单声道会比 .NET 慢,但至少在我的实验中并非如此。

我有一台带有 .NET 框架的 Windows xp 笔记本电脑。我在 Windows xp 之上的 vmware vmplayer 上运行 CentOS。我想试试单声道。所以抓取了 Mono 2.6.1 源并将其安装在 vmplayer 中的 CentOS 上。我已经使用 .Net 2.0 编写了一个测试 Web 服务应用程序,在 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 的 Math 实现只是高效的。但是很多实现,比如处理财务数据,图形计算,很多都依赖于Math库。在没有 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();
    }

最佳答案

这是关于这个的讨论 Mono mailing list不久前。他们提供的理由是 Mono 在 Linux 下得到了高度优化(具体如何似乎没有被提及)。但如果您在 Linux 上运行 Mono,Mono 并不是这里唯一的变量。这是一个不同的操作系统,不同的进程调度程序和各种内核级子系统会对性能产生明显不同的影响,这与 Mono 团队的工作无关。 Mono 还大量使用 compiler intrinsics ,.NET 可能会也可能不会。

但是,在大多数情况下,Windows 上的 Mono 与 Windows 上的 .NET 比较,您可能会发现 .NET 经常击败 Mono。但即便如此,Mono 也不一定总是输。事实上,对于专门针对 Mono 优化的代码(例如:使用 Mono.SIMD),与 .NET 相比,您可能会在 Mono 上获得一个数量级更好的性能,无论平台如何。

关于c# - 单声道项目 : Why is mono faster than . NET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397700/

相关文章:

c# - 跨不同系统使用 Azure Service Fabric Reliable Actors

c# - Microsoft.Build 和 Microsoft.Web.Administration nuget 包之间的冲突

c# - UTF8编码不加字节序标记

c# - 通过 Mantis SOAP API 以编程方式下载附件?

c# - 用于 Android 预处理器宏的 Mono

c# - CurrentThread.CurrentCulture 和单元测试

c# - Windows Phone 8 CommunicationException 远程服务器返回错误 : NotFound

c# - 从代码绑定(bind)到 WinRT/UWP 中的自定义附加属性

c# - MVC 5 - RedirectToAction 不重定向

mono - 人们在 Mono/MonoDevelop 中使用什么 BDD 框架