以下两段代码之间是否存在性能差异?
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
我很确定编译器会优化它.执行什么是最可读/遵循约定,让编译器处理这样的简单事情.
即使没有进行优化,性能差异也可以忽略不计.
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.此外,它通过寄存器传递然后将值存储在堆栈上.我想知道在调试器中运行代码来查看汇编程序是否正在改变代码的生成方式.