5

コンパイラのパフォーマンスを試しています。非常に小さなコードがあり、浮動小数点の乗算と加算がいくつかあります。コードは数百万回ループで実行されます。C++、c#、java、perl、python ... でコードをコンパイルしようとしています。次に、実行時間を測定しながら結果を実行します。

C# のパフォーマンスにはかなり不満があります。私の c# コードは、同等の C++ または Java よりも約 60% 遅くなります。確かに、私の実験にはバグがあるに違いありません。結果のバイナリを逆アセンブルして、その理由を知りたいと思います。

MSIL コードにそのようなオプションはありますか? c# JIT コンパイラの結果は、マシン命令レベル (MSIL 命令ではなく x86 命令) で調べることができますか?

アップデート

コード (u、v、g* は double、steps は整数)

stopwatch.Start();
for (int i = 0; i < steps; i++)
{
    double uu = g11 * u + g12 * v;
    v = g21 * u + g22 * v;
    u = uu;
}
stopwatch.Stop();
4

3 に答える 3

7

Visual Studio でコードをデバッグし (ただし、リリース モードでコンパイルします)、ループにブレークポイントを配置し、実行がブレークポイントで停止したときに [逆アセンブリ] ウィンドウを開きます ([デバッグ] -> [ウィンドウ] -> [逆アセンブリ])。

于 2011-05-14T11:28:01.923 に答える
4

プログラムを生成し、結果を分解します。

于 2011-05-14T11:22:46.883 に答える
1

JITコンパイルを避けるために、最初にバイナリをngen (ネイティブコードにコンパイル)することができます。

于 2011-05-14T11:22:01.557 に答える