我刚刚完成了Bruce Eckel的《C++编程思想》中的内联函数章节。其中有一个练习要求你创建两个完全相同的函数,一个是内联函数,另一个不是。然后使用clock()函数计算每个函数执行所用的时间。我曾经处理过类似的问题,我认为这并不复杂。因此,我得出了以下结论:
#include <iostream>
#include <ctime>
using namespace std;
inline int infun(int x) {
x = 3;
x = 5;
cout << "";
return x;
}
int fun(int x) {
x = 3;
x = 5;
cout << "";
return x;
}
int main() {
clock_t startIn = clock();
for (int i = 0; i < 10000000; i++) {
infun(i);
}
clock_t finishIn = clock();
clock_t start = clock();
for (int i = 0; i < 10000000; i++) {
fun(i);
}
clock_t finish = clock();
clock_t startIn2 = clock();
for (int i = 0; i < 10000000; i++) {
infun(i);
}
clock_t finishIn2 = clock();
cout << "Inline: " << (finishIn - startIn) << endl << "Regular Function: "
<< (finish - start) << endl<< "Second Inline: " << finishIn2 - startIn2 << endl;
return 0;
}
输出
Inline: 195842
Regular Function: 166564
Second Inline: 162917
我有三个函数。其中两个是完全相同的内联函数,另一个是非内联函数(为了测试目的而创建这种情况)。
a) 为什么第一个内联函数需要那么长时间(对于任何首次执行的函数都是如此) b) 如果重复次数减少(比如1000),普通函数比其他函数更快。
即使是更简单的函数也能满足我的测试用例:
inline int infun(int x) {
return x;
}
我还检查了汇编输出,以确保这些内联函数确实是内联的或者g++没有将非内联函数提升为内联函数。感谢您的时间,欢迎任何反馈。
inline
只是一种建议,编译器会自行决定是否实际内联代码。此外,缓存效应可能会导致完全相同的代码在时间上有所不同。标准的clock
也有很多细节,你可能会看到一个并不存在的巨大差异。 - Mark Ransom