我正在进行速度实验并计算内联函数和常规函数,并且我在常规函数上反复获得更好的时间。你能不能看看代码,并帮我弄清楚为什么内联应该提高速度。
由于
#include "stdafx.h"
#include <iostream>
#include "time.h"
inline int getMaxInline( int x, int y )
{
return ( x > y ) ? x : y;
}
int getMaxRegular( int, int );
int _tmain(int argc, _TCHAR* argv[])
{
clock_t inlineStart;
clock_t inlineFinish;
clock_t regularStart;
clock_t regularFinish;
inlineStart = clock();
std::cout<<"inline max of 20 and 10 = "<<getMaxInline( 10, 20 )<<std::endl;
inlineFinish = clock();
std::cout<<"Time elapsed for inline = "<<(double(inlineFinish - inlineStart)/CLOCKS_PER_SEC)<<std::endl;
regularStart = clock();
std::cout<<"regular max of 20 and 10 = "<<getMaxRegular( 20, 10 )<<std::endl;
regularFinish = clock();
std::cout<<"Time elapsed for regular = "<<(double(regularFinish - regularStart)/CLOCKS_PER_SEC)<<std::endl;
return 0;
}
int getMaxRegular( int x, int y )
{
return ( x > y ) ? x : y;
}
我的最后3次测试开始了:
内联= 0.042 常规= 0.003
内联= 0.004 常规= 0.002
内联= 0.006 常规= 0.002
任何见解?
由于
答案 0 :(得分:3)
答案 1 :(得分:1)
inline
函数与未内联函数之间的差异取决于编译器和优化设置的100%。
关键字inline
是对编译器的建议。允许忽略该建议。
给定两个相等的函数,inline
函数和非内联函数之间的唯一区别应该是调用和返回开销。这是至少2个处理器指令,呼叫和返回。让我们假设调用和返回指令各占1毫秒(非常非常慢)。你通过内联节省了2毫秒。等待用户I / O以秒为单位。文件I / O通常以毫秒为单位。那么,那2毫秒有意义吗?在一般情况下,没有。
但等等,这不是你获得的全部。通过删除额外的调用,在某些处理器中可以防止重新加载指令缓存。这可以为你节省一些巨大的纳秒。再说一次,它有意义吗?可能不是。
另一方面,你花了很多时间来分析和试验这个。那个时候你可能会花费你的程序更健壮和正确。您的优化 - 内联 - 称为微优化。通常这些优化具有非常低的投资回报率。
答案 2 :(得分:0)
我认为时钟不够精细,无法为这么小的功能提供准确的数字。相反,计算一个循环调用每个函数需要多长时间,如一万次或十万次,然后将结果时间除以通话次数,以获得更准确的测量。尝试选择一个循环计数,使每个循环运行一到十秒。
另外,在您计时时不要打印。然后,您需要对I / O进行计时,而不仅仅是函数调用。在这种情况下,I / O可能比实际功能需要更长的时间。