C ++:为什么常规函数比Inline函数运行得更快?

时间:2015-02-26 22:16:29

标签: c++ visual-c++

我正在进行速度实验并计算内联函数和常规函数,并且我在常规函数上反复获得更好的时间。你能不能看看代码,并帮我弄清楚为什么内联应该提高速度。

由于

#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

任何见解?

由于

3 个答案:

答案 0 :(得分:3)

直言不讳地说,你的程序甚至不是像构建精确测量代码性能的程序一样远程构建的。在对内联函数的调用中,CPU代码和分支预测缓存中的所有输出代码都不热。在你对非内联函数的调用中,它是。由于避免单次调用/返回操作,这将完全支配任何微观差异。

答案 1 :(得分:1)

inline函数与未内联函数之间的差异取决于编译器和优化设置的100%。

关键字inline是对编译器的建议。允许忽略该建议。

给定两个相等的函数,inline函数和非内联函数之间的唯一区别应该是调用和返回开销。这是至少2个处理器指令,呼叫和返回。让我们假设调用和返回指令各占1毫秒(非常非常慢)。你通过内联节省了2毫秒。等待用户I / O以秒为单位。文件I / O通常以毫秒为单位。那么,那2毫秒有意义吗?在一般情况下,没有。

但等等,这不是你获得的全部。通过删除额外的调用,在某些处理器中可以防止重新加载指令缓存。这可以为你节省一些巨大的纳秒。再说一次,它有意义吗?可能不是。

另一方面,你花了很多时间来分析和试验这个。那个时候你可能会花费你的程序更健壮和正确。您的优化 - 内联 - 称为微优化。通常这些优化具有非常低的投资回报率。

答案 2 :(得分:0)

我认为时钟不够精细,无法为这么小的功能提供准确的数字。相反,计算一个循环调用每个函数需要多长时间,如一万次或十万次,然后将结果时间除以通话次数,以获得更准确的测量。尝试选择一个循环计数,使每个循环运行一到十秒。

另外,在您计时时不要打印。然后,您需要对I / O进行计时,而不仅仅是函数调用。在这种情况下,I / O可能比实际功能需要更长的时间。