排除'Else'条款会有性能差异吗?

The*_*att 6 .net c#

以下两段代码之间是否存在性能差异?

if (myCondition)
{
     return "returnVal1";
}

return "returnVal2"
Run Code Online (Sandbox Code Playgroud)

if (myCondition)
{
     return "returnVal1";
}
else
{
     return "returnVal2";
}
Run Code Online (Sandbox Code Playgroud)

我的直觉是编译器应该对此进行优化,并且应该没有区别,但我经常看到它在我们的代码中完成了两种方式.我想知道它是否归结为偏好和可读性.

Coo*_*une 13

我很确定编译器会优化它.执行什么是最可读/遵循约定,让编译器处理这样的简单事情.

即使没有进行优化,性能差异也可以忽略不计.

  • 正如你所说,这里的性能影响是微不足道的,所以它归结为一个强调问题.如果你想要将两种可能性理解为相等,那么使用if/then/else可能会更清楚.如果一种可能性是特殊情况,例如由于缺少数据而无法继续,则可能更清楚地使用if/then以避免碰到过去的其他内容. (3认同)

Ski*_*izz 12

找出答案的最佳方法是查看代码!这是VS2005 C#在发布模式下生成的代码:

    static bool F1 (int condition)
    {
      if (condition > 100)
00000000  push        ebp  
00000001  mov         ebp,esp 
00000003  push        eax  
00000004  mov         dword ptr [ebp-4],ecx 
00000007  cmp         dword ptr ds:[009185C8h],0 
0000000e  je          00000015 
00000010  call        79469149 
00000015  cmp         dword ptr [ebp-4],64h 
00000019  jle         00000024 
      {
        return true;
0000001b  mov         eax,1 
00000020  mov         esp,ebp 
00000022  pop         ebp  
00000023  ret              
      }

      return false;
00000024  xor         eax,eax 
00000026  mov         esp,ebp 
00000028  pop         ebp  
00000029  ret              
            }

    static bool F2 (int condition)
    {
      if (condition > 100)
00000000  push        ebp  
00000001  mov         ebp,esp 
00000003  push        eax  
00000004  mov         dword ptr [ebp-4],ecx 
00000007  cmp         dword ptr ds:[009185C8h],0 
0000000e  je          00000015 
00000010  call        79469109 
00000015  cmp         dword ptr [ebp-4],64h 
00000019  jle         00000024 
      {
        return true;
0000001b  mov         eax,1 
00000020  mov         esp,ebp 
00000022  pop         ebp  
00000023  ret              
      }
      else
      {
        return false;
00000024  xor         eax,eax 
00000026  mov         esp,ebp 
00000028  pop         ebp  
00000029  ret              
            }
Run Code Online (Sandbox Code Playgroud)

这表明两个版本产生完全相同的代码,正如您所希望的那样.我还尝试了第三种选择:

    static bool F3 (int condition)
    {
      return condition > 100;
00000000  push        ebp  
00000001  mov         ebp,esp 
00000003  push        eax  
00000004  mov         dword ptr [ebp-4],ecx 
00000007  cmp         dword ptr ds:[009185C8h],0 
0000000e  je          00000015 
00000010  call        794690C9 
00000015  cmp         dword ptr [ebp-4],64h 
00000019  setg        al   
0000001c  movzx       eax,al 
0000001f  mov         esp,ebp 
00000021  pop         ebp  
00000022  ret              
            }
Run Code Online (Sandbox Code Playgroud)

这是非常有效的,因为它从不分支(和分支通常是坏的!).

编辑

实际上,找出哪个更有效的最好方法是分析代码,而不是查看汇编程序.

而且,它产生的代码很不寻常.push eax/mov [],ecx位是相同的,当然,作为单推ecx.此外,它通过寄存器传递然后将值存储在堆栈上.我想知道在调试器中运行代码来查看汇编程序是否正在改变代码的生成方式.

  • 不是一个分支? (2认同)

Mex*_*ker 5

虽然优化是一件好事,但可读性也很重要,所以如果你认为有助于提高可读性,那么它比你节省的纳秒更好.恕我直言