c# – 排除’Else’条款是否存在性能差异?

以下两段代码之间是否存在性能差异?
if (myCondition)
{
     return "returnVal1";
}

return "returnVal2"

if (myCondition)
{
     return "returnVal1";
}
else
{
     return "returnVal2";
}

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

解决方法

找出答案的最佳方法是查看代码!这是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,0 
0000000e  je          00000015 
00000010  call        79469109 
00000015  cmp         dword ptr [ebp-4],ebp 
00000022  pop         ebp  
00000023  ret              
      }
      else
      {
        return false;
00000024  xor         eax,ebp 
00000028  pop         ebp  
00000029  ret              
            }

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

static bool F3 (int condition)
    {
      return condition > 100;
00000000  push        ebp  
00000001  mov         ebp,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              
            }

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

编辑

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

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...