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) だけです。