【发布时间】:2013-03-14 18:50:36
【问题描述】:
我测量了两种计算 2 的幂的方法的执行时间:
1) 内联
result = b * b;
2) 通过简单的函数调用
result = Power(b);
在调试模式下运行时,一切都按预期进行:调用函数比在线计算要昂贵得多(在线 385 毫秒对 570 毫秒函数调用)。
在发布模式下,我希望编译器能够大大加快函数调用的执行时间,因为编译器会在内部内联非常小的 Power() 函数。但我不希望函数调用比手动内联计算更快。
最令人惊讶的是:在发布版本中,第一次运行需要 109 毫秒,而调用 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;
}
}
【问题讨论】:
-
你在调试器(F5)下启动程序了吗?在这种情况下,优化被抑制了。
-
您是在发布模式下运行生成的 .exe 还是在 VS 中运行?另外,您是否尝试过以不同的顺序调用它们?我发现这会产生微妙的差异
-
那么,为什么使用 int 作为双精度比使用双精度更快?
-
@Vercas:很可能是因为递增和比较双精度值更昂贵。
-
@DanielHilgarth 啊,好点...
标签: c# performance release inline inline-code