16

LLVM プロジェクトを使用したMonoは、C# .NET プロジェクトをコンパイルするための非常に強力な最適化を備えた LLVM コンパイラ バックエンドを使用できます。これにより、計算負荷の高いアプリケーションで約 20% 高速に実行できます。

Mono は、Mono の組み込み JIT コンパイラーに加えて、コード生成のバックエンドとして LLVM を使用できるようになりました。これにより、Mono は LLVM で行われるすべてのコンパイラ最適化の恩恵を受けることができます。たとえば、SciMark スコアは482から610になります。

では、既存の C# .NET プロジェクトをターゲットにして Mono/LLVM を使用し、Windows または Unix 用のより高速なアプリケーションを取得することは可能ですか? それはとても簡単ですか、それともアプリケーション コードをリファクタリング/変更する必要がありますか? これは通常の .NET Framework でも動作しますか、それとも Mono Framework プロジェクト専用ですか? これを考慮して、次のように述べられました。

この余分なパフォーマンスには代償が伴います。LLVM を使用して JIT コンパイルを行うと、より多くの時間とメモリが消費されます。

4

4 に答える 4

4

LLVMバックエンドはMonoのJITコンパイラ(アプリケーションの実行時にILアセンブリをネイティブアセンブリに変換するもの)にフックされているため、Monoを使用してアプリケーションを実行する必要があります。

于 2012-07-30T10:32:11.610 に答える
3

最初に行う必要があるのは、プロファイラーの下でプログラムを実行し、結果を見て、頻繁に呼び出されるホットスポットやメソッドを見つけることです。

通常のありきたりのデスクトップ アプリケーションの場合、.NET/Mono の低レベルの最適化に依存しても、パフォーマンスが大幅に向上することはありません。これは C/C++ ではありません。

于 2012-07-30T20:31:05.677 に答える
2

この場合、CPU または時間ベースのプロファイラーはメトリックをベンチマークと比較するのに役立ちますが、ホットパスまたはメソッドのホットスポットは、コンパイラを変更しても変更されませんが、テストの別の実行パスを介して変更されます。

ホット パス、排他バイト数の多いメソッドはアプリケーション コードのアーティファクトであり、そのコードがネイティブ CPU でどのように変換および最適化されるかではありません。Event Tracing for Windows (ETW) を使用した perfview などのツールは JIT 固有の統計情報を提供し、多数のサンプリングまたは時間ベースのプロファイラーをマイクロベンチマークに使用できると述べましたが、これを正しく行うのは難しい場合があります。

于 2015-01-31T23:21:32.610 に答える
1

私のベンチマークでは、Mono が同じタスクを実行するのに、MS .NET の約 2 倍の時間がかかることがよくあります。したがって、LLVM で Mono を 20% 高速化しても、Microsoft に追いつくには不十分です。また、何らかの理由で、Windows で --llvm フラグを使用しても、ほとんど違いはありません。おそらく、何らかの理由で LLVM が Windows で無効にされていたのかもしれません (または、2011 年にベンチマークを行ったときに無効になっていました)。

于 2013-05-22T18:48:13.087 に答える