在浮点类型上使用时,<=和> =的性能

时间:2019-06-10 08:35:37

标签: c# performance operators

我听说使用<=>=运算符时,编译器会自动对其进行优化,例如:(int)Variable >= 2变为(int)Variable > 1。浮点类型是否真的如此?在我看来,(float)Variable >= 2不能优化到(float)Variable > 1.999999999而不至于无穷大,要么导致它变得不可能,要么导致性能下降。 (我知道性能上的差异可能很小,但这只是我想知道的事情)

1 个答案:

答案 0 :(得分:1)

如果您检查生成的IL代码,则不正确。例如,考虑以下类:

public class C 
{
    public void M() 
    {
        float a = 4;
        float b = 5;
        bool result = a >= b;
    }
}

生成的IL代码如下:

.class public auto ansi beforefieldinit C
    extends [mscorlib]System.Object
{
    // Methods
    .method public hidebysig 
        instance void M () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 22 (0x16)
        .maxstack 2
        .locals init (
            [0] float32,
            [1] float32,
            [2] bool
        )

        IL_0000: nop
        IL_0001: ldc.r4 4
        IL_0006: stloc.0
        IL_0007: ldc.r4 5
        IL_000c: stloc.1
        IL_000d: ldloc.0
        IL_000e: ldloc.1
        IL_000f: clt.un
        IL_0011: ldc.i4.0
        IL_0012: ceq
        IL_0014: stloc.2
        IL_0015: ret
    } // end of method C::M

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2072
        // Code size 8 (0x8)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: nop
        IL_0007: ret
    } // end of method C::.ctor

} // end of class C

如果您阅读上面生成的IL代码(用作对IL命令this的引用),您会发现这不是正确的。

简而言之,在上面的IL代码中,将float号装入堆栈,然后使用clt.un操作,

  

如果value1

然后使用ceq比较此操作的结果是否等于0,

  

如果value1等于value2,则按1(int32类型),否则按0。

,则上述结果分配给结果variable