C++ 两种数字比较方法中哪一种更有效
在数字比较函数中,我们可以使用if子句,一个是use if else,另一个是直接使用return。因为如果它不返回大的,另一个肯定是大的 现在的问题是:哪个更有效?我测试了一个计时函数,它无法区分 方法A:C++ 两种数字比较方法中哪一种更有效,c++,c,C++,C,在数字比较函数中,我们可以使用if子句,一个是use if else,另一个是直接使用return。因为如果它不返回大的,另一个肯定是大的 现在的问题是:哪个更有效?我测试了一个计时函数,它无法区分 方法A: int getmax(int a,int b){ if (a>b)return a; else return b; } 方法B: int getmax(int a,int b){ if (a>b)return a; return b; } 很抱歉让你们中的一
int getmax(int a,int b){
if (a>b)return a;
else return b;
}
方法B:
int getmax(int a,int b){
if (a>b)return a;
return b;
}
很抱歉让你们中的一些人不高兴。我有这个问题是因为我想知道else条款对时间的影响。else条款会花费更多的时间吗?虽然我在for循环中运行了100000000次,但这似乎是一个随机效率。我看不出这样的比较有什么意义,但如果您真的很好奇,让我们比较一下VC11生成的程序集:
int getmax_1(int a,int b)
{
if (a>b)
return a;
else
return b;
}
int getmax_2(int a,int b)
{
if (a>b)
return a;
return b;
}
getmax_1
if (a>b)
002017BE mov eax,dword ptr [a]
002017C1 cmp eax,dword ptr [b]
002017C4 jle getmax_1+2Dh (02017CDh)
return a;
002017C6 mov eax,dword ptr [a]
002017C9 jmp getmax_1+30h (02017D0h)
else
002017CB jmp getmax_1+30h (02017D0h)
return b;
002017CD mov eax,dword ptr [b]
getmax_2
if (a>b)
002017FE mov eax,dword ptr [a]
00201801 cmp eax,dword ptr [b]
00201804 jle getmax_2+2Bh (020180Bh)
return a;
00201806 mov eax,dword ptr [a]
00201809 jmp getmax_2+2Eh (020180Eh)
return b;
0020180B mov eax,dword ptr [b]
然而,这是一个调试构建。在发布版本中,这两个调用肯定是内联的,第二个函数中的附加调用可能会被消除
所以。。。没有区别,真的。我强烈建议使用第二个选项,因为它基本上做相同的事情,但没有任何额外的代码。你可以这样看:
函数在
return
语句处转义,并可能返回指定的值。话虽如此,在if
语句之后转义函数已经是一个好主意,这没有什么错。if
后面的return
语句将退出函数,不考虑其后的任何代码。这意味着else
是不必要的,只是编译器的额外工作,而不是必需的 绝对没有区别。else
子句不生成任何可执行代码。在机器指令级,只存在到给定地址的有条件和无条件分支。在C语言中有种goto
因此,两个函数的执行方式如下:
if (a > b) goto label_1;
return_register = b;
goto label_2;
label_1:
return_register = a;
label_2:
return return_register;
在我看来,你问过在C或C++领域中,一个或另一个是否有效。说: 在抽象机器中,所有表达式都按照语义指定的方式进行计算。一 如果可以推断表达式的 未使用该值,且未产生所需的副作用(包括由 调用函数或访问易失性对象) <> C++标准有类似之处。 由于我们缺少关于实际实现的关键细节(比如一段代码是否为非最优,另一段代码是否为最优),并且标准没有规定什么是有效的,因此您的问题没有明确的答案。。。至少,在C或C++领域中不是这样。您必须标记编译器是什么,而不是[c]和[c++] 其他可能影响程序效率的因素有。。。好节目!众所周知,随着代码和数据的增长,缓存丢失的风险也随之增加。出于这个原因,您可能不应该单独测试这段代码:它不会带来任何有意义的结果,因为在您更改某些内容时,这些数字会发生变化 因此,我们通常避免过早的优化,主要是通过易读易写的代码来解决实际问题。一旦你找到了现实问题的解决方案(并且得到了老板的许可或要求对其进行优化),使用你的档案器确定哪些是最重要的瓶颈,并尝试对其进行优化 如果您试图在其他任何地方进行优化,特别是通过引入额外的代码或数据来减少其他地方的代码或数据,那么您可能会将更重要的优化推到您无法企及的地方 一旦优化了最重要的瓶颈,请再次使用探查器以确保优化成功,并确定可以优化的其他方面
这很可能会挽救你的工作,有一天…如果他们是平等的呢?我想你不需要知道这些吧?我认为这没什么区别。试着用计时器运行它们数亿次。计时器在循环之外。这取决于编译器,任何非愚蠢的编译器都会生成完全相同的代码。如果使用三元运算符呢?但我认为像@teppic一样,编译器非常聪明!您不能使用任何比较
返回a^((b^a)和-(b
:)我只是通过gcc运行了它-那里完全相同的程序集。有趣的是,VC11输出中的第二个jmp将永远不会执行。它的唯一效果是在机器代码中消耗2字节的空间。