以下两段代码之间是否存在性能差异?
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.此外,它通过寄存器传递然后将值存储在堆栈上.我想知道在调试器中运行代码来查看汇编程序是否正在改变代码的生成方式.