「マネージ オーバーヘッド」構造 (チェック インデックス付きの配列など) が使用されていない場合でも、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;
}
このループの実行には 3.88 秒かかります (/o でコンパイル)。VC 2010 (-O2) でコンパイルされた同等のループには 2.95 秒かかります。
劣悪なコードが実際に生成されたことを確認するために、マシン コードを比較しました。VC コンパイラからリスト (/FAs) を作成し、デバッガーを C# プログラムに接続しました (ループが完了した後)。
実際、C++ 版はいくつかの巧妙なトリックを使用しています。たとえば、コストのかかる 7 の乗算を避けるために、ループ カウントごとに 7 ずつインクリメントされる別のレジスタがあります。C#版は毎回掛け算(imul)をしています。他にも違いがあります。
C# のジッターでは、ビルド時の VC よりも実行時にコードをコンパイルする時間がはるかに短いことを理解しています。しかし、たとえば Java のジッタは、頻繁に使用されるメソッドを動的に最適化しています。C#はそれをしていないようです。
私の質問は、将来のフレームワーク バージョンで C# ジッターを改善する計画はありますか?