「管理されたオーバーヘッド」コンストラクトが使用されていない(チェックインされたインデックス付きの配列など)場合でも、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#ジッタを改善する計画はありますか?
Visual Studio RC 2012 with .NET 4。5は昨日からダウンロード可能です。それをダウンロードして(無料です)、そこで同じテストを実行してください。 –
私はずっと前にジッタによって行われた新しい最適化のために息を止めました。 MSはその部門で十分だと思っているようです。 – harold
@haroldいつから? –