我注意到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抖动是动态优化常用方法。 C#似乎没有这样做。
我的问题是:是否有计划在未来的框架版本中改进C#jitter?
答案 0 :(得分:9)
发布版本,VS2008SP1,.NET 3.5SP1,平均10次测试:
.NET, x86: 2.646 seconds
C++, x86: 2.652 seconds
.NET, x64: 2.352 seconds
C++, x64: 2.090 seconds
经典错误假设/ o很重要,测量jitting时间,运行调试版本,使用附加的调试器进行测试,以便禁用抖动优化器。
x64抖动使用您提到的相同技巧,它不是C ++代码生成器所独有的:
00000030 xor r9d,r9d
...
00000059 add r9d,7
.NET 4.5的一项新功能是配置文件引导优化。
微软这样的公司永远不会分享未来的计划,没有必要猜测它们。
答案 1 :(得分:3)
是否计划在未来的框架版本中改进C#jitter?
你是否在问上个月微软和Xamarin之间是否真的举行了一次秘密会议,同意他们在过去的十年里都在改善他们各自的紧张情绪,但是从现在开始他们都厌倦了让事情变得更好,并且不会再费心了,MS会重新分配所有人,而Xamarin会拒绝任何改善抖动的提交补丁吗?
我想说这不太可能,而且像世界上其他所有积极开发的软件项目一样,有计划对其进行改进。
此外,如果我真的想尽快运行您提供的代码,我会将其手动优化为return 161315136;
。像这样的代码可以证明在给定的情况下实现A比实现B慢,但没有说明任何实现背后的人应该集中精力。