我注意到,即使没有使用“托管开销”结构(例如带有检查索引的数组),C#抖动产生的代码也比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编译)。用VC2010 (-O2)编译的等效循环需要2.95s。
为了验证是否真的生成了次要代码,我比较了机器代码:从VC编译器创建了一个清单(/FAs),并在C#程序上附加了一个调试器(在循环完成后)。
实际上,C++版本使用了一些聪明的技巧。例如,为了避免成本高昂的乘以7,存在一个单独的寄存器,该寄存器在每次循环计数时都会递增7。C#版本每次执行乘法(imul)。还有其他不同之处。
我知道C# jitter在运行时编译代码的时间比VC在构建时少得多。但是例如,Java jitter正在动态地优化常用的方法。C#似乎没有做到这一点。
我的问题是:在未来的框架版本中,是否有改善C#抖动的计划?
发布于 2012-08-16 18:34:09
发布版本,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很重要,测量抖动时间,运行调试构建,使用附加的调试器进行测试,因此禁用了抖动优化器。
x64抖动使用您提到的相同技巧,它不是C++代码生成器所独有的:
00000030 xor r9d,r9d
...
00000059 add r9d,7
.NET 4.5的一个新功能是配置文件引导优化。
像微软这样的公司从来不会分享未来的计划,也没有必要去猜测它们。
发布于 2012-08-16 15:30:44
在未来的框架版本中是否有改善C#抖动的计划?
你是不是在问,上个月微软和Xamarin之间是否有过一次秘密会议,当时他们都花了十年的时间来改善各自的抖动,但从现在开始,他们厌倦了让事情变得更好,不会再麻烦了,MS会重新分配每个人,而Xamarin会拒绝任何提交的改善抖动的补丁?
我想说这是不太可能的,并且像世界上所有其他积极开发的软件项目一样,有改进它的计划。
此外,如果我真的想尽可能快地运行您给出的代码,我会手动将其优化到return 161315136;
。这样的代码可以证明在给定的情况下实现A比实现B慢,但没有说明任何一个实现背后的人应该把他们的精力集中在哪里。
https://stackoverflow.com/questions/11989614
复制相似问题