代码之家  ›  专栏  ›  技术社区  ›  Jordy van Eijk

“variable==true”与“true==variable”[closed]之间的性能差异

  •  -4
  • Jordy van Eijk  · 技术社区  · 6 年前

    这需要关闭/删除,因为差异不是他们的 这是我自己的错。但我不想删除我自己的问题 因为我会被封锁。所以,如果有一个主持人可以做到这一点 为了我。。

    我希望有人能告诉我两者的性能差异是什么

    variable == true vs true == variable 经过一些测试后,我意识到了这一点 true==变量 它的速度几乎是它的两倍 变量==true 也许这完全无关紧要,但我只是想知道。

    但经过几次跑步后,我看到了以下结果:

    性能测试 'variableTrue == true' vs 'true == variableTrue'

    Performance for 'variableTrue == true'
    Average: 0.333442949999999 ms
    Min: 0.2784 ms
    Max: 7.6198 ms
    
    Performance for 'variableTrue == false'
    Average: 0.330602419999998 ms
    Min: 0.2784 ms
    Max: 10.2835 ms
    
    Performance for 'true == variableTrue'
    Average: 0.668567990000006 ms
    Min: 0.5568 ms
    Max: 7.9245 ms
    
    Performance for 'false == variableTrue'
    Average: 0.660314390000008 ms
    Min: 0.5568 ms
    Max: 10.5792 ms
    

    性能测试 'variableFalse == false' vs 'false == variableFalse'

    Performance for 'variableFalse == true'
    Average: 0.31614 ms
    Min: 0.295 ms
    Max: 0.4047 ms
    
    Performance for 'variableFalse == false'
    Average: 0.29688 ms
    Min: 0.2947 ms
    Max: 0.3082 ms
    
    Performance for 'true == variableFalse'
    Average: 0.74112 ms
    Min: 0.5901 ms
    Max: 1.9459 ms
    
    Performance for 'false == variableFalse'
    Average: 0.62093 ms
    Min: 0.5895 ms
    Max: 0.781 ms
    
    Press any key to continue
    

    我测试它的代码可以在这里找到 'variable == true' vs 'true == variable'

    2 回复  |  直到 6 年前
        1
  •  4
  •   FCin    6 年前

    没有区别。原因如下:

    代码:

    public class C {
        private bool value = false;
    
        public void M() {
            if(value == true)
            {
    
            }
    
            if(true == value)
            {
    
            }
        }
    }
    

    产生了什么:

    // Fields
    .field private bool 'value'
    
    // Methods
    .method public hidebysig 
        instance void M () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 26 (0x1a)
        .maxstack 1
        .locals init (
            [0] bool, // first bool variable
            [1] bool  // second bool variable
        )
    
        IL_0000: nop
        IL_0001: ldarg.0               // load first bool
        IL_0002: ldfld bool C::'value' // load value
        IL_0007: stloc.0               // store field in first bool
        // sequence point: hidden
        IL_0008: ldloc.0               // load first bool
        IL_0009: brfalse.s IL_000d     // branch if false
    
        IL_000b: nop                   // debug garbage
        IL_000c: nop                   // debug garbage
    
        IL_000d: ldarg.0               // load first bool
        IL_000e: ldfld bool C::'value' // load value
        IL_0013: stloc.1               // store value in second bool
        // sequence point: hidden
        IL_0014: ldloc.1               // load second bool
        IL_0015: brfalse.s IL_0019     // branch if false
    
        IL_0017: nop
        IL_0018: nop
    
        IL_0019: ret
    } // end of method C::M
    

    在调试模式下编译,但这无关紧要。关键是,两者都有 if 声明完全相同。发布版本要“更好”:

    .field private static bool 'value'
    
    .method private hidebysig static void 
    Main(
      string[] args
    ) cil managed 
    {
    .entrypoint
    .maxstack 8
    
    // [18 13 - 18 31]
    IL_0000: ldsfld       bool ConsoleA.Program::'value' // Load value
    IL_0005: brfalse.s    IL_000d                        // Branch if false
    
    // USED ONLY SO COMPILER WONT COMPLETELY REMOVE IF STATEMENTS
    // [20 17 - 20 36]
    IL_0007: ldnull       
    IL_0008: call         void [mscorlib]System.GC::KeepAlive(object)
    
    // [23 13 - 23 31]
    IL_000d: ldsfld       bool ConsoleA.Program::'value'  // Load value
    IL_0012: brfalse.s    IL_001a                         // Branch if false
    
    // USED ONLY SO COMPILER WONT COMPLETELY REMOVE IF STATEMENTS
    // [25 17 - 25 36]
    IL_0014: ldnull       
    IL_0015: call         void [mscorlib]System.GC::KeepAlive(object)
    
    // [27 9 - 27 10]
    IL_001a: ret          
    
    } // end of method Program::Main
    
        2
  •  1
  •   Thomas Ayoub    6 年前

    你的代码有输入错误,等等 line 146 ,同样的情况也会发生 160 .

    你用的秒表不对。复制/粘贴时要小心。

    使用正确的一个,你会得到几乎完全相同的执行时间,往往证明FCin的答案。

    见结果:

    enter image description here