3

我编写了一个自定义 C 代码,其中包含 main 和另一个由 main 调用的函数。我多次执行此功能(〜100万)。在一个代码中,我将此函数声明为 __inline,而在另一个代码中,我将其声明为 __declspec(noinline)。我使用 WinDBG 监视了反汇编,发现后者像普通函数调用一样使用 push pop 和分支,而前者没有使用此类指令并正确内联函数。然而他们两人的时间却完全一样。以下是代码:(在 A9 cortex CPU (Tegra 3) 上执行此代码)

__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;
}

谁能解释我为什么?我为第二次测试所做的只是将 __inline 更改为 __declspec(noinline)。

4

3 回答 3

3

printf()通话费用非常昂贵。函数调用时间与执行所需的时间相比相形见绌printf()

实证检验

printf()比函数调用慢多少?你不会得到相同的结果。我正在使用 Linux、X11 和 xterm。

10 9 次函​​数调用

__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;
}

10 5 printf()

#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;
    for (i = 0; i < 100000; i++)
        printf("%d\n", i);
    return 0;
}

结果

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

于 2013-03-14T06:19:46.123 回答
2

您的函数包括一个 printf。打印到控制台比调用单个函数慢几个数量级,所以不管它是否内联,大部分时间都花在了 printf 上。

于 2013-03-14T06:19:52.720 回答
1

只是猜测,您正在内联一个带有 a 的函数printf由于 printf 指令远不止是几个 push,因此内联的好处几乎是 0。请注意,您标记Windows的时间是相同的:我想 Linux 上也会发生同样的情况。

于 2013-03-14T06:20:18.843 回答