我有一个关于表演的问题。我认为这也适用于其他语言(不仅仅是C++)。
假设我有这样的功能:
int addNumber(int a, int b){
int result = a + b;
return result;
}如果我像这样写上面的代码,有什么性能改进吗?
int addNumber(int a, int b){
return a + b;
}我有这个问题,因为第二个函数没有声明第三个变量。但是编译器会在第一段代码中检测到这一点吗?
发布于 2016-10-09 00:15:26
要回答这个问题,你可以look at the generated assembler code。使用-O2,x86-64 gcc 6.2为这两种方法生成完全相同的代码:
addNumber(int, int):
lea eax, [rdi+rsi]
ret
addNumber2(int, int):
lea eax, [rdi+rsi]
ret只有在没有启动优化的情况下,there is a difference
addNumber(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov DWORD PTR [rbp-24], esi
mov edx, DWORD PTR [rbp-20]
mov eax, DWORD PTR [rbp-24]
add eax, edx
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
addNumber2(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
mov edx, DWORD PTR [rbp-4]
mov eax, DWORD PTR [rbp-8]
add eax, edx
pop rbp
ret然而,在没有优化的情况下进行性能比较是毫无意义的。
发布于 2016-10-09 00:57:58
原则上,这两种方法没有区别。大多数编译器几十年来一直在处理这类优化。
此外,如果函数可以内联(例如,编译器在编译使用该函数的代码时可以看到它的定义),大多数编译器将完全消除该函数,只需发出代码以添加传递的两个变量,并根据调用方的要求存储结果。
显然,上面的注释假设使用相关的优化设置进行编译(例如,在没有优化的情况下不进行调试构建)。
就我个人而言,我不会写这样的函数。在调用者中,编写c = a + b比编写c = addNumber(a, b)更容易,因此这样的函数对程序员(努力理解)或程序(性能等)都没有好处。你最好写一些没有提供有用信息的评论。
c = a + b; // add a and b and store into c任何有自尊心的代码审阅者都会对信息不足的功能或信息不足的评论提出尖锐的抱怨。
只有当它的名称为应用程序传递了一些特殊的含义(即不仅仅是添加两个值)时,我才会使用这样的函数
c = FunkyOperation(a,b);
int FunkyOperation(int a, int b)
{
/* Many useful ways of implementing this operation.
One of those ways happens to be addition, but we need to
go through 25 pages of obscure mathematical proof to
realise that
*/
return a + b;
}https://stackoverflow.com/questions/39938660
复制相似问题