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

前端之家收集整理的这篇文章主要介绍了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.此外,它通过寄存器传递然后将值存储在堆栈上.我想知道在调试器中运行代码来查看汇编程序是否正在改变代码生成方式.

原文链接:https://www.f2er.com/csharp/99057.html

猜你在找的C#相关文章