web-dev-qa-db-ja.com

Monoプロジェクト:Monoが.NETより速いのはなぜですか?

Monoが.NETよりも高速であることに驚いています。なぜそうなのか誰か知っていますか? Monoは.NETよりも遅いと思っていましたが、少なくとも私の実験ではそうではありませんでした。

.NETフレームワークを備えたWindows XPラップトップを持っています。私はWindows XPの上部にあるvmware vmplayerでCentOSを実行しています。モノを試したかった。そのため、Mono 2.6.1ソースを取得して、vmplayerのCentOSにインストールしました。私は.Net 2.0を使用してテストWebサービスアプリケーションを作成し、ウィンドウで実行しました。動作しました。再コンパイルせずにバイナリをvmplayerのCentosに転送し、centosで実行しました。やったー!人生は良いですが、それから何かが私の注意をひきつけました。 CentOSでのアプリケーションの実行はより高速であるように見えました。私は自分の目を信じていませんでした。

私の観察を確認するために、ネットワーク応答は多くの外部要因に依存するため、ネットワークを方程式から除外しました。

インターネットから小さなダミーループコードを取得し、CentOSと同様にWindowsで実行されるビジュアルスタジオでコンパイルしました。結果は次のとおりです。

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

誰かがこの振る舞いを説明できれば、それは素晴らしいことです。私の素人の理解はモノの実装は.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();
    }
39
funwithcoding

これは Monoメーリングリスト でのこれに関する議論でした。彼らが提供した理由は、MonoがLinuxで非常に最適化されていることです(正確には、どのように言及されていないようでした)。ただし、LinuxでMonoを実行している場合、Monoだけが変数ではありません。それは、異なるOS、異なるプロセススケジューラ、およびさまざまなカーネルレベルのサブシステムであり、Monoチームの作業とは無関係に、パフォーマンスに著しく異なる影響を与える可能性があります。 Monoは コンパイラ組み込み関数 も頻繁に使用します。これは.NETが行う場合と行わない場合があります。

ただし、ほとんどの場合、Mono on Windowsと.NET on Windowsの比較では、.NETがMonoよりも頻繁に使用されていることがわかります。しかし、それでも、Monoが常に失われるとは限りません。実際、Mono用に特別に最適化されたコード(例:Mono.SIMDの使用)の場合、プラットフォームに関係なく、Monoと.NETでパフォーマンスが桁違いに向上する可能性があります。

59
joemoe

ここでは比較をあまり重視していません。基本的には、2つの関数(Math.Pow)を比較します。おそらく、実際のアプリケーションは、この1つの機能よりも多くのことを行います。

MonoのMath.Powは、これをCで実装することによって最適化されているように見えます。Netがそれを実装する方法はわかりません。マネージコードで完全に実装できます。

どちらのランタイムも、毎日のニーズに十分対応できることがわかります。

8
jpobst