【问题标题】:performance and elegance issue with boolean syntax布尔语法的性能和优雅问题
【发布时间】:2012-08-30 12:36:08
【问题描述】:

这个问题更多的是性能问题而不是优雅,我为自己说话,但是......

有两个选项来实现,这对于 cpu 计算来说更快,或者如果最后它是相同的(我倾向于认为是,因为条件是 (x

    public int DidLogcount = 0; // DidLogCount is raised by +1 every time we deside, then condition is met 
    public bool MoreLogsAllowed()
    {
        if (DidLogcount < 10) return true;
        else return false;
    }

    public bool MoreLogsAllowed()
    {
       return DidLogcount < 10;
    }

我们大部分时间都想检查它是否不为空,但如果必须,它会影响这两种情况,所以如果我没有错过任何其他问题,我猜我只是缩小了范围(?)。

我会应用正确的答案。 谢谢。

编辑: 我只是想标记正确的答案,但在加载了 3 个以上的页面上进行了刷新......

将等待获得更多选票...现在,我真的要感谢大家!为了分享您的知识,我确实想到了编译器的优化问题,所以......虽然这些打印输出显示了一些东西,尽管它本身的差异很小,但是当添加到一堆条件时,它就更少了little ,除非我们谈论的是一个真正复杂的应用程序,否则我不会说 big 。 我应该说,性能问题从来都不是小问题,还有逻辑和可读性 感谢@Steve 和@Nick 为我们实际测试它。

【问题讨论】:

标签: c# c#-4.0 coding-style boolean logic


【解决方案1】:

我不确定是否会有任何性能差异,如果有的话,它可以忽略不计。但第二种情况更优雅。

【讨论】:

  • 它不仅更优雅而且值得推荐。一些 IDE 或 Resharper 会提示您。
  • @BlueM Resharper ... 我第一次阅读这个术语时,我会在我的代码超过 1k 行时用谷歌搜索
【解决方案2】:

使用 LinqPAD 测试。

int DidLogcount = 5;
void Main()
{
    MoreLogsAllowed();
    MoreLogsAllowed2();
}

public bool MoreLogsAllowed() 
{ 
    if (DidLogcount < 10) return true; 
    else return false; 
} 

public bool MoreLogsAllowed2() 
{ 
    return (DidLogcount < 10); 
} 

并生成此 IL 代码

IL_0000:  ldarg.0     
IL_0001:  call        UserQuery.MoreLogsAllowed
IL_0006:  pop         
IL_0007:  ldarg.0     
IL_0008:  call        UserQuery.MoreLogsAllowed2

MoreLogsAllowed:
IL_0000:  ldarg.0     
IL_0001:  ldfld       UserQuery.DidLogcount
IL_0006:  ldc.i4.s    0A 
IL_0008:  bge.s       IL_000C
IL_000A:  ldc.i4.1    
IL_000B:  ret         
IL_000C:  ldc.i4.0    
IL_000D:  ret         

MoreLogsAllowed2:
IL_0000:  ldarg.0     
IL_0001:  ldfld       UserQuery.DidLogcount
IL_0006:  ldc.i4.s    0A 
IL_0008:  clt         
IL_000A:  ret    

第二个版本不仅更优雅,而且似乎生成的代码更短。
为了确保这不是 LinqPAD 引入的差异,我使用 Visual Studio 2010 创建了一个小型控制台应用程序,并在发布模式下使用默认设置进行编译。
然后我用 ILDASM 查看了 ILcolde。
我确认上面的代码与编译器生成的代码相同。
当然差异可以忽略不计,但两个版本产生的 IL 代码并不相同。

【讨论】:

  • 这看起来是一个完全未优化的调试式编译?
  • @utopianheaven 你是对的。 LinqPAD 没有优化,我现在设置了正确的选项,我更新了代码,但还是有区别
【解决方案3】:

对我来说,第一个例子没有优雅。而且我认为编译器会优化第一种情况,所以没有什么可谈的。对我来说,第二个例子更简洁、更短、更易读。

【讨论】:

    【解决方案4】:

    如果这两种选择之间的性能存在差异,我会感到非常惊讶。我也发现第二种选择更优雅,我什至会省略括号。

    然而,对于更复杂的条件,尤其是在涉及函数调用的情况下,将两个 return 语句放在不同的行上可以更方便地在使用调试器单步执行代码时找出正在发生的事情。

    【讨论】:

      【解决方案5】:

      任何性能差异都可能可以忽略不计,并且高度依赖于 .NET JIT 编译 - 但查看 x86 示例,比较结果如下:

                      if (DidLogcount < 10) return true;
      ... skipped DidLogCount call...
          00000020  mov         dword ptr [ebp-4],eax 
          00000023  cmp         dword ptr [ebp-4],0Ah 
          00000027  jge         00000037 
          00000029  mov         eax,1 
          0000002e  and         eax,0FFh 
          00000033  mov         esp,ebp 
          00000035  pop         ebp 
          00000036  ret 
                      else return false;
          00000037  xor         eax,eax 
          00000039  mov         esp,ebp 
          0000003b  pop         ebp 
          0000003c  ret 
      

                  return (DidLogcount < 10);
          ... skipped DidLogCount call...
      0000001f  mov         dword ptr [ebp-4],eax 
      00000022  cmp         dword ptr [ebp-4],0Ah 
      00000026  setl        al 
      00000029  movzx       eax,al 
      0000002c  mov         esp,ebp 
      0000002e  pop         ebp 
      0000002f  ret 
      

      后者可能会稍微快一些 - 但同样取决于您的 CPU 处理这些指令的方式。

      最好的答案是编写一个测试应用程序来衡量它!

      【讨论】:

      • 我正在尝试在第一个示例中找出“0000002e and eax,0FFh”的意义——任何帮助将不胜感激!
      • 我倾向于将我的大部分代码编译成 x64,如果您必须使用 1 或 2 个最清晰的效果,关于 64 与 x86(32 位)的主要问题是什么,就像语言(abc ) 什么时候你可以用 48 个字母组成一半的句子?
      • 所以如果我相信你的话,这有点难。并非总是在 x64 上更快,我认为并非每个型号都意味着它比它的前身更好,但我确信从 x86 或更多notesebly 32bit 到 64bit 转向 x64 是一个胜利 99.999999 % 如果它不是 100
      • 我猜想多线程和多核对性能的影响不仅仅是位。
      【解决方案6】:

      两个片段之间没有区别,因为最重要的是MSIL,在编译之后,在这种情况下,编译后的代码是相同的。

      Code 1 C# -> MSIL 1 -> Code natif 1
      
      Code 2 C# -> MSIL 1 -> Code natif 1
      

      【讨论】:

      • 史蒂夫和尼克琼斯的回答另有说明。
      • 所以史蒂夫尼克和我,有什么问题??我是小慢,每个人都可能有同样的问题
      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2012-09-16
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多