我注意到 C# jitter 产生的代码比 C++ 编译器慢得多,即使没有使用“托管开销”结构(例如带有检查索引的数组)。
为了量化它,我对以下简单循环进行了计时:
public static int count = 1000000000;
public static int Main()
{
int j = 0;
for (int i = 0; i < count; ++i)
{
j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7);
}
return j;
}
这个循环需要 3.88 秒来执行(用 /o 编译)。使用 VC 2010 (-O2) 编译的等效循环需要 2.95 秒。
为了验证是否确实生成了劣质代码,我比较了机器代码:从 VC 编译器创建了一个列表 (/FAs),并将调试器附加到 C# 程序(循环完成后)。
事实上,C++ 版本正在使用一些巧妙的技巧。例如,为了避免代价高昂的乘以 7,有一个单独的寄存器,每次循环计数都会增加 7。C# 版本每次都进行乘法 (imul)。还有其他差异。
我知道 C# jitter 在运行时编译代码的时间比 VC 在构建时要少得多。但例如Java jitter 正在动态优化常用方法。C# 似乎没有这样做。
我的问题是:是否有计划在未来的框架版本中改进 C# 抖动?