2012-08-16 40 views
7

「管理されたオーバーヘッド」コンストラクトが使用されていない(チェックインされたインデックス付きの配列など)場合でも、C#ジッタはC++コンパイラよりもかなり遅いコードを生成することに気づきました。それを定量化する将来のフレームワークバージョンでのジッタの改善

、私は、次の単純なループを計時:

public static int count = 1000000000; 
public static int Main() 
{ 
    int j = 0; 
    for (int i = 0; i < count; ++i) 
    { 
     j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7); 
    } 
    return j; 
} 

このループは(/ Oでコンパイル)を実行する3.88sを要します。 VC 2010(-O2)でコンパイルされた等価ループは2.95秒かかる。

下位コードが実際に生成されたことを確認するために、マシンコードを比較しました。つまり、VCコンパイラからリスティング(/ FA)を作成し、C#プログラムにループを完了した後にデバッガをアタッチしました。

確かに、C++バージョンでは、いくつかの巧妙なトリックを使用しています。例えば、7による高価な乗算を避けるために、ループカウントごとに7ずつインクリメントされる個別のレジスタがあります。 C#版は毎回乗法(imul)を行います。他にも違いがあります。

私は、C#ジッタがビルド時にVCよりも実行時にコードをコンパイルする時間が非常に短いことを理解します。しかし、例えば。 Javaジッタは、頻繁に使用されるメソッドを動的に最適化します。 C#はそれをやっていないようです。

私の質問です:将来のフレームワークバージョンでC#ジッタを改善する計画はありますか?

+0

Visual Studio RC 2012 with .NET 4。5は昨日からダウンロード可能です。それをダウンロードして(無料です)、そこで同じテストを実行してください。 –

+0

私はずっと前にジッタによって行われた新しい最適化のために息を止めました。 MSはその部門で十分だと思っているようです。 – harold

+0

@haroldいつから? –

答えて

3

将来のフレームワークバージョンでC#ジッタを改善する計画はありますか?

それは、彼らは両方とも今から彼らの上の病気だったことを、それぞれのジッタを改善し、最後の十年を費やしたと思いながら、ことが合意されたMicrosoftとXamarinの間で秘密会議先月が実際にあった場合、あなたが求めていますXamarinはジッタを改善した提出されたパッチを拒否する一方、MSは誰もを再割り当てするだろうか?

私は、これは起こりそうもなく、積極的に開発された他のすべてのソフトウェアプロジェクトと同様に、改善する計画があると言います。

さらに、私が実際にあなたができるだけ早く与えたコードを実行したいのであれば、それをreturn 161315136;に手で最適化したいと思います。このようなコードは、実装Aが実装Bよりも遅いことを証明できますが、どちらの実装の背後にいる人々が自分の努力に集中すべきかについては何も言及していません。

+0

このコードは、C#ジッタが、C#の方がC++よりも遅いことに責任があることを証明するもので、多くの人(ハーブ・サッターを含む)が言及する「管理オーバーヘッド」だけではありません。明らかに、単純な整数演算や分岐よりもパフォーマンスがはるかに優れています。 – kaalus

+0

ええ、しかし、@ HansPassantの結果とは別に、それがどれほど関連しているかという問題があります。これは、ジッタチームが努力するためには必然的なケースですか?もし彼らがそうしていれば、彼らの誰かが書くことが十分に興味深いでしょうか?私はループ内での乗算についてのブログ記事が急速になっているのではなく、そのような問題に関する記事で「あなたと他のいくつかの改善点」の行に入ると考えています。 –

+0

C#のジッタを改善することで大きな成果が得られると思います。私は、C#がComputer Language Benchmarks Game(http://shootout.alioth.debian.org)でJavaにマッチするか、Javaを上回ることを見たいと思っています。 C#にはネイティブの値の型があり、Javaはほとんどの場合かなり高速です。彼らはMonoでテストしますが、そこにMSの実装はありません。 – kaalus

9

リリースビルド、VS2008SP1、.NET 3.5SP1、10回の試験の平均:

.NET, x86: 2.646 seconds 
C++, x86: 2.652 seconds 
.NET, x64: 2.352 seconds 
C++, x64: 2.090 seconds 

古典的なミスが、/ Oが重要であると仮定jitting時間を測定、デバッグビルドを実行して、添付デバッガでテストしていますジッタオプティマイザは無効になります。

x64のジッタはあなたが言及した同じトリックを使用して、それがC++コードジェネレータに固有のものではありません。

00000030 xor   r9d,r9d 
... 
00000059 add   r9d,7 

.NET 4.5の新機能は、プロファイルに基づく最適化です。

今後の計画は、Microsoftのような企業によって決して共有されることはなく、推測のポイントはありません。

+0

これは受け入れられる答えです。 – hoodaticus