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

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

概述以下两段代码之间是否存在性能差异? if (myCondition){ return "returnVal1";}return "returnVal2" 和 if (myCondition){ return "returnVal1";}else{ return "returnVal2";} 我的直觉是编译器应该对此进行优化,并且应该没有区别,但我经常 以下两段代码之间是否存在性能差异?
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.此外,它通过寄存器传递然后将值存储在堆栈上.我想知道在调试器中运行代码来查看汇编程序是否正在改变代码的生成方式.

总结

以上是内存溢出为你收集整理的c# – 排除’Else’条款是否存在性能差异?全部内容,希望文章能够帮你解决c# – 排除’Else’条款是否存在性能差异?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1242749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存