C Windows执行内联和非内联函数所用的时间相同。为什么?

C Windows执行内联和非内联函数所用的时间相同。为什么?,c,C,我已经用main编写了一个自定义C代码,main调用了另一个函数。我多次执行此函数(~100万次)。在一段代码中,我将此函数声明为_inline,在另一段代码中,我将其声明为_declspec(noinline)。我使用WinDBG监控了分解,发现后者像普通函数调用一样使用push-pop和branch,而前者没有使用此类指令并正确内联函数。然而,他们的时代却完全相同。代码如下: (在A9 cortex CPU(Tegra 3)上执行此代码) \uuuu内联int-multifunc(int-a

我已经用main编写了一个自定义C代码,main调用了另一个函数。我多次执行此函数(~100万次)。在一段代码中,我将此函数声明为_inline,在另一段代码中,我将其声明为_declspec(noinline)。我使用WinDBG监控了分解,发现后者像普通函数调用一样使用push-pop和branch,而前者没有使用此类指令并正确内联函数。然而,他们的时代却完全相同。代码如下: (在A9 cortex CPU(Tegra 3)上执行此代码)

\uuuu内联int-multifunc(int-a,int-b);
int main(int argc,字符**argv){
无符号long int timeBefore,i;
无符号长整数timeAfter;
无符号整数a[11500],j,k,l;
双倍过去;
timeBefore=GetTickCount();
printf(“\n%ld”,timeBefore);
对于(l=1;l而言,
printf()
调用非常昂贵。函数调用时间与执行
printf()
所需的时间相比相形见绌

实证检验 与函数调用相比,
printf()
要慢多少?您不会得到相同的结果。我使用的是Linux、X11和xterm

109函数调用 结果
我的系统上的挂钟时间显示,
printf()
程序花费的时间是有函数调用的程序的7.6倍,这意味着
printf()
花费的时间是函数调用的76000倍。将内联决策留给编译器。

您的函数包含一个printf。打印到控制台比调用单个函数慢几个数量级,因此,无论它是否内联,最大的时间都花在printf上。

只是猜测,您是内联的使用
printf
调用一个函数。由于printf指令不仅仅是几次推送,所以内联的好处几乎是0。请注意,您标记了
Windows
占用了相同的时间:我想Linux上也会发生同样的情况。

我想这可能根本不重要,因为printf无论如何,这是一个相当昂贵的函数;如果printf需要10000个周期,初始化堆栈帧所需的6个周期的开销应该不太明显。但关键是即使使用printf,两个函数都应该显示出一些差异。因为调用的数量非常大,两个函数的计时应该显示出巨大的差异。这10000个周期CLE对两个程序都是通用的。但其中一个程序的6个周期是额外的。这应该显示几秒钟的差异。两次运行是否显示了完全相同的经过的滴答数?它们可能会有所不同。即使您运行同一程序两次,它甚至会变化几滴答。内联的好处在任何背景噪音中都会消失即使连续运行两次,您的程序也会以不同的速度运行:缓存、后台任务、室温和随机机会。@nvoigt是正确的。在具有非平凡I/O子系统的现代操作系统上,信噪比将非常差。请验证/确保编译器不会应用任何像tra这样的聪明优化N对puts进行一次巨大的调用。@H2CO3:这需要循环展开一个100k元素的循环,谢天谢地,
nm-D
表明确实使用了
printf
。很好。而且可以理解,这将是巨大的,真的。但我见过编译器做得非常整洁,比如我对
clang
b的回答一个完整的函数体。
__inline int multifunc(int a, int b);

int main(int argc, char **argv) {

    unsigned long int timeBefore, i;
    unsigned long int timeAfter;
    unsigned int a[11500], j, k, l;
    double elapsed;
    timeBefore = GetTickCount();
    printf("\n%ld", timeBefore); 


    for(l=1; l<300;l++)
    {
for(i=0; i<11500; i++)
{
    j = i+l;
    k=1;
    a[i] = multifunc(j, k);
}

    }
printf("\n%ld", timeBefore);
    timeAfter = GetTickCount();

    printf("\n%ld", timeAfter);


    return -1;
}

__inline int multifunc(int a, int b)
{
    int d;
    d = a+b;
printf("%d", d);
    return d;
}
__attribute__((noinline))
static int function(int x)
{
    return x;
}
int main(int argc, char *argv[])
{
    int i, a = 0;
    for (i = 0; i < 1000000000; i++)
        a += function(i);
    return a;
}
#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;
    for (i = 0; i < 100000; i++)
        printf("%d\n", i);
    return 0;
}