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();
}
これは Monoメーリングリスト でのこれに関する議論でした。彼らが提供した理由は、MonoがLinuxで非常に最適化されていることです(正確には、どのように言及されていないようでした)。ただし、LinuxでMonoを実行している場合、Monoだけが変数ではありません。それは、異なるOS、異なるプロセススケジューラ、およびさまざまなカーネルレベルのサブシステムであり、Monoチームの作業とは無関係に、パフォーマンスに著しく異なる影響を与える可能性があります。 Monoは コンパイラ組み込み関数 も頻繁に使用します。これは.NETが行う場合と行わない場合があります。
ただし、ほとんどの場合、Mono on Windowsと.NET on Windowsの比較では、.NETがMonoよりも頻繁に使用されていることがわかります。しかし、それでも、Monoが常に失われるとは限りません。実際、Mono用に特別に最適化されたコード(例:Mono.SIMDの使用)の場合、プラットフォームに関係なく、Monoと.NETでパフォーマンスが桁違いに向上する可能性があります。
ここでは比較をあまり重視していません。基本的には、2つの関数(Math.Pow)を比較します。おそらく、実際のアプリケーションは、この1つの機能よりも多くのことを行います。
MonoのMath.Powは、これをCで実装することによって最適化されているように見えます。Netがそれを実装する方法はわかりません。マネージコードで完全に実装できます。
どちらのランタイムも、毎日のニーズに十分対応できることがわかります。