0

型サフィックス (値がゼロのデュアルの場合は0d 、浮動小数点数の場合は0fなど) を使用することが必要な場合があり、多くの場合、適切なスタイルと見なされます。

しかし、パフォーマンスへの影響はありますか?

数百万回の呼び出し

if (x == 0d) ...   or
if (x == 0.0) ...

と同じくらい速くなります

if (x == 0) ...

おそらく、コンパイラは 0 を 0.0 に一度変換するので、パフォーマンスには問題ありません。しかし、品質コードで数回見たので、よくわかりません...


コメントのために追加されました: x is not an int its a double.

4

2 に答える 2

4

ILコードを調べると、リテラルconvと比較すると追加のオペコードintが 見つかります0.0

int x = 0;
Console.WriteLine (x == 0.0);

IL_0000:  ldc.i4.0    
IL_0001:  stloc.0     // x
IL_0002:  ldloc.0     // x
IL_0003:  conv.r8     //<-- this is absent if literal is 0
IL_0004:  ldc.r8      00 00 00 00 00 00 00 00 
IL_000D:  ceq         
IL_000F:  call        System.Console.WriteLine

これは、Int32 ==演算子のオーバーロードintが 2 番目のパラメーターとして受け入れるという事実によるものです。

備考:コンパイラ最適化フラグonを使用して LINQPad でコンパイルされました。

これがボトルネックであることが確実になるまで、ナノ最適化を行わないでください。このような最適化は通常、コードの可読性を損ない、結果として保守性を損ないます。

于 2013-03-27T13:57:56.657 に答える
0

Ilya Ivanov のヒントを得て、小さなサンプル プログラムの IL コードを調べました。

Ilya は x が整数であると仮定しました。これが事実である場合、変換に関する彼のコメント (conv.r8) は完全に正しいです。しかし、私が念頭に置いていたのは、double 型の変数を double リテラルと比較する場合です。 この場合、型サフィックスは違いますか?

答えはノーだ!

(d == 0) または (d == 0d) を比較して、この小さなプログラムを見てみましょう。

static void Main(string[] args)
{
    double d = 0.0;

    if (d == 0)     // if (d == 0d)
        d = 1.23;

    Console.WriteLine(d);
}

どちらのバージョンもまったく同じ IL コードにコンパイルされます。

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 48 (0x30)
    .maxstack 2
    .entrypoint
    .locals init (
        [0] float64 d,
        [1] bool CS$4$0000
    )

    IL_0000: nop
    IL_0001: ldc.r8 0.0
    IL_000a: stloc.0
    IL_000b: ldloc.0
    IL_000c: ldc.r8 0.0
    IL_0015: ceq
    IL_0017: ldc.i4.0
    IL_0018: ceq
    IL_001a: stloc.1
    IL_001b: ldloc.1
    IL_001c: brtrue.s IL_0028

    IL_001e: ldc.r8 1.23
    IL_0027: stloc.0

    IL_0028: ldloc.0
    IL_0029: call void [mscorlib]System.Console::WriteLine(float64)
    IL_002e: nop
    IL_002f: ret
} // end of method Program::Main

もちろん、アセンブラコードも同じです。

したがって、0.0 または 0d の代わりに 0 を書き込むことは問題ありません...

于 2013-03-27T14:58:30.013 に答える