3

main と、main によって呼び出される別の関数を含むカスタム C コードを作成しました。この関数を何度も実行しています (~100 万)。あるコードではこの関数を __inline として宣言し、別のコードでは __declspec(noinline) として宣言しました。WinDBG を使用して逆アセンブルを監視したところ、後者は通常の関数呼び出しのようにプッシュ ポップとブランチを使用し、前者はそのような命令を使用せず、関数を適切にインライン化していることがわかりました。しかし、両方の時間はまったく同じです。以下はコードです:(このコードを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;
}

誰かが私に理由を説明できますか? 2 番目のテストで変更するのは、__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 に答える