Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:为什么一个常规函数运行的速度要比内联函数快?_C++_Visual C++ - Fatal编程技术网

C++ C++;:为什么一个常规函数运行的速度要比内联函数快?

C++ C++;:为什么一个常规函数运行的速度要比内联函数快?,c++,visual-c++,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 );

我做了一个速度实验,对内联函数和常规函数进行了计时,我反复在常规函数上获得了更好的计时效果。你能看一下代码并帮我弄明白为什么内联应该提高速度吗

谢谢

#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;
}
#包括“stdafx.h”
#包括
#包括“time.h”
内联int getMaxInline(int x,int y)
{
返回(x>y)?x:y;
}
int getMaxRegular(int,int);
int _tmain(int argc,_TCHAR*argv[]
{
时钟在线启动;
时钟输入完成;
时钟定时启动;
时钟定时完成;
inlineStart=时钟();

std::cout我认为时钟的粒度不足以为这样一个小函数提供准确的数字。相反,一个循环调用每个函数所需的时间,比如一万次或十万次,然后将得到的时间除以调用计数,以获得更准确的测量值。试着选择一个将使每个循环运行一到十秒


另外,在计时时不要打印东西。然后,你在计时I/O,而不仅仅是函数调用。在这种情况下,I/O可能比实际函数花费更长的时间。

坦率地说,你的程序的构造方式甚至与精确测量代码性能的程序的构造方式不同。在对inl的调用中在CPU代码和分支预测缓存中,所有的输出代码都不是热的。在对非内联函数的调用中,它是热的。由于避免了单个调用/返回操作,这将完全控制任何微观差异。

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

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

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

但是,等等,这并不是你得到的全部。通过删除一个额外的调用,在某些处理器中,你可以防止指令缓存被重新加载。这可以节省你一些巨大的纳秒。同样,它重要吗?可能不重要


另一方面,您已经花费了大量的开发时间来分析和试验这一点。您可以花费这些时间使您的程序更加健壮和正确。您的优化(内联)称为微优化。通常这些优化的投资回报率非常低。

您的输出代码的输出如何不显示。你的函数getMaxRegular没有显示。我们如何知道它没有被操纵?另外,inline是一个建议,而不是命令。你需要验证它实际上是由编译器内联的。计时方法也完全是假的。还有clock:返回程序消耗的处理器时间。这不是真正的run time…看看你的#s。它们太小了,你可能只是在测量噪音。这篇文章有太多错误。结果的输出比你调用的函数要长数千倍。函数之间的任何可能的差异都是纳秒,而不是毫秒。@SilverBackApe:你做得好吗对如何制作有用的基准测试进行任何研究?关于如何制作有用的基准测试,有很多信息。另外:在运行测试之前禁用任何CPU频率缩放。另外:将测试运行到perf、callgrind或vtune中,以获取详细的计时信息。另外:任何具有LTO的现代编译器都会对此进行优化。