【问题标题】:Performance difference between 'variable == true' vs 'true == variable' [closed]“变量==真”与“真==变量”之间的性能差异[关闭]
【发布时间】:2018-05-18 12:45:34
【问题描述】:

这需要关闭/删除,因为区别不是他们的 这是我自己的错。但我不想删除我自己的问题 因为我可以被阻止。所以如果有版主可以做到这一点 对我来说..

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

variable == truetrue == variable 经过一些测试,我发现true == variable 的速度几乎是variable == 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'

【问题讨论】:

  • 我希望你在发布模式下编译,并在没有附加调试器的情况下执行(直接从命令行或 Visual Studio 中的 shift-F5)。微基准测试非常复杂。
  • 啊,它是 sanDbox,不是 sanbbox
  • 只将variabletrue!variable 进行比较而不是与false 进行比较呢?在处理 bool 时,这将是我个人的偏好。
  • 使用BenchmarkDotNet(在没有附加调试器的情况下启动,发布,从控制台)
  • @xanatos 这是没有调试刚刚启动的 exe 本身

标签: c# performance


【解决方案1】:

没有区别。原因如下:

代码:

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

在Debug模式下编译,不过没关系。关键是,两个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】:

    您的代码在line 146 上包含一个错字,在160 行中也是如此。

    您没有使用正确的秒表。小心复制/粘贴。

    使用正确的执行时间,您将获得几乎完全相同的执行时间来证明 FCin 的答案。

    查看结果:

    【讨论】:

    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 2017-01-23
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    相关资源
    最近更新 更多