2の累乗を計算する2つの方法で実行時間を測定しました。
1)インライン
result = b * b;
2)簡単な関数呼び出しで
result = Power(b);
デバッグモードで実行している場合、すべてが期待どおりです。関数の呼び出しは、計算をインラインで実行するよりもかなりコストがかかります(ラインで385ミリ秒、関数呼び出しで570ミリ秒)。
リリースモードでは、コンパイラが非常に小さな関数を内部的にインライン化するため、コンパイラが関数呼び出しの実行時間を大幅に短縮することを期待しPower()
ます。しかし、関数呼び出しが手動のインライン計算よりも高速であるとは思いません。
最も驚くべきことに、これが当てはまります。リリースビルドでは、最初の実行には109ミリ秒が必要であり、呼び出しを伴う2回目の実行にはPower()
62ミリ秒しか必要ありません。
関数呼び出しは、手動のインライン化よりもどのように高速になりますか?
これがあなたの複製のためのプログラムです:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Test");
// 1. Calculating inline without function call
Stopwatch sw = Stopwatch.StartNew();
for (double d = 0; d < 100000000; d++)
{
double res = d * d;
}
sw.Stop();
Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);
// 2. Calulating power with function call
Stopwatch sw2 = Stopwatch.StartNew();
for (int d = 0; d < 100000000; d++)
{
double res = Power(d);
}
sw2.Stop();
Console.WriteLine("Function: " + sw2.ElapsedMilliseconds);
Console.ReadKey();
}
static double Power(double d)
{
return d * d;
}
}