【发布时间】:2012-12-24 20:02:42
【问题描述】:
using System;
namespace ConsoleApplication1
{
class TestMath
{
static void Main()
{
double res = 0.0;
for(int i =0;i<1000000;++i)
res += System.Math.Sqrt(2.0);
Console.WriteLine(res);
Console.ReadKey();
}
}
}
通过将此代码与 c++ 版本进行基准测试,我发现性能比 c++ 版本慢 10 倍。我对此没有任何问题,但这导致我提出以下问题:
似乎(经过几次搜索)JIT 编译器无法像 c++ 编译器那样优化此代码,即只需调用一次 sqrt 并对其应用 *1000000。
有没有办法强制 JIT 去做?
【问题讨论】:
-
我看不出 JIT 编译器 不能 这样做的任何原因。当前版本可能会也可能不会,但这并不意味着未来版本不会。我很好奇-您是否尝试在发布模式下编译,而不是调试模式?您可能会发现发布模式大大提高了性能。
-
@ChrisShain 你确定编译器可以做到这一点吗?必须确保 Math.Sqrt 没有副作用,因此可以将其减少为单次调用。
-
这些数字对我来说并没有加起来。 C# 版本运行时间长 10 倍,但调用次数却是一百万次?
-
@John:不,它只是一个教育目的代码。不是生产代码,如果它是“实际”的意思。
-
除了使用发布版本之外,还要确保您没有附加调试器(即直接在 Visual Studio 之外启动 exe。)
标签: c# optimization jit