代码之家  ›  专栏  ›  技术社区  ›  funwithcoding

Mono项目:为什么Mono比.NET快?

  •  39
  • funwithcoding  · 技术社区  · 14 年前

    我很惊讶地发现mono比.net快。有人知道为什么吗?我本来以为Mono比.NET慢,但至少在我的实验中不是这样。

    我有一台带有.NET框架的Windows XP笔记本电脑。我在Windows XP之上的vmware vmplayer上运行CentOS。我想试试单声道。所以抓取Mono2.6.1源并安装在vmplayer的CentOS上。我用.NET 2.0编写了一个测试WebService应用程序,在wndow上执行它,它工作了,我将二进制文件传输到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();
        }
    
    4 回复  |  直到 8 年前
        1
  •  59
  •   joemoe    14 年前

    这是关于 Mono mailing list 不久前。他们提供的理由是mono在Linux下非常优化(确切地说,似乎没有提到)。但是,如果您在Linux上运行mono,mono并不是这里唯一的变量。它是一个不同的操作系统,不同的进程调度程序和不同的内核级子系统可以对性能产生显著不同的影响,独立于Mono团队的工作。Mono还大量使用 compiler intrinsics ,这是.NET可以做的,也可以不做的。

    然而,大多数时候 Windows上的单声道 与.NET在Windows上的比较,您可能会发现.NET比Mono更频繁。但即便如此,单核细胞增多症也未必总是会消失。事实上,对于专门针对mono优化的代码(例如:使用mono.simd),无论平台如何,您都可能在mono与.net上获得一个数量级更好的性能。

        2
  •  8
  •   jpobst    14 年前

    你在这里并没有做太多的比较。你基本上是在比较两个函数之间的一个函数(math.pow)。假设一个真正的应用程序要比这个函数做更多的事情。

    mono的math.pow通过在C.I不知道.NET如何实现它来优化。它可以在托管代码中完全实现。

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

        3
  •  -4
  •   Mindmaster    11 年前

    所有这些真正的测试都是计时器的实现——这通常是糟糕的测试,因为没有两个操作系统实现相同的测试。有些使用的是非常精确的硬计时器(Linux),有些使用的计时器超过了可以根据系统需要抢占的计时器(Windows)。如果你想对一个呼叫进行基准测试,你可以避免中间的呼叫,或者你可能是在计时,而不是你认为你在测试什么。两个平台上的数学能力将几乎相同,因为计算它的数学在一百年内没有改变。我学习操作系统与计时器的区别比任何东西都多。

        4
  •  -21
  •   Sam Chad    8 年前

    嗯,我并不惊讶它更快地执行相同的字节码。

    如果您尝试使用Windows版本的Mono,我希望它的性能差别较小,除非涉及到SIMD优化操作。