我上课的培训材料似乎是两个相互矛盾的陈述.
一方面:
"使用内联函数通常可以更快地执行"
另一方面:
"使用内联函数可能会因更频繁的交换而降低性能"
问题1:这两个陈述都是正确的吗?
问题2:这里"交换"是什么意思?
请看一下这个片段:
int powA(int a, int b) {
return (a + b)*(a + b) ;
}
inline int powB(int a, int b) {
return (a + b)*(a + b) ;
}
int main () {
Timer *t = new Timer;
for(int a = 0; a < 9000; ++a) {
for(int b = 0; b < 9000; ++b) {
int i = (a + b)*(a + b); // 322 ms <-----
// int i = powA(a, b); // not inline : 450 ms
// int i = powB(a, b); // inline : 469 ms
}
}
double d = t->ms();
cout << "--> " << d << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题3:为什么表现powA和powB?之间的表现如此相似?我预计powB性能将达到322毫秒,因为它毕竟是内联的.
是的,在特定情况下,这两种说法都是正确的.显然,他们不会都成为真正的在同一时间.
"交换"可能是对OS分页行为的引用,当内存压力变高时,页面将被换出到磁盘.
实际上,如果您的内联函数很小,那么由于消除了函数调用和返回的开销,您通常会注意到性能的提高.但是,在非常罕见的情况下,您可能会导致代码增长,使其无法完全驻留在CPU缓存中(在性能关键的紧密循环期间),并且您可能会遇到性能下降的问题.但是,如果您在该级别进行编码,那么您可能应该直接使用汇编语言进行编码.
该inline改性剂是一种暗示来,它可能要考虑编译给定函数内联的编译器.它不必遵循您的指示,结果也可能取决于给定的编译器选项.您始终可以查看生成的汇编代码以了解其执行的操作.
你的基准测试可能甚至没有做你想做的事情,因为你的编译器可能足够聪明,甚至没有使用你指定的函数调用的结果i,所以它甚至可能不会打扰你的函数.再看一下生成的汇编代码.
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |