未来框架版本中的C#抖动改进

kaa*_*lus 7 c# optimization jit

我注意到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;
}
Run Code Online (Sandbox Code Playgroud)

这个循环需要3.88秒来执行(用/ o编译).使用VC 2010(-O2)编译的等效循环需要2.95秒.

为了验证实际生成了劣质代码,我比较了机器代码:从VC编译器创建了一个列表(/ FAs),并将一个调试器附加到C#程序(在循环完成之后).

的确,C++版本正在使用一些聪明的技巧.例如,为了避免昂贵的乘法乘以7,有一个单独的寄存器,每个循环计数增加7.C#版本每次都进行乘法(imul).还有其他差异.

据我所知,C#jitter在运行时编译代码的时间远远少于构建时的VC.但是,例如Java抖动是动态优化常用方法.C#似乎没有这样做.

我的问题是:是否有计划在未来的框架版本中改进C#jitter?

Han*_*ant 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
Run Code Online (Sandbox Code Playgroud)

经典错误假设/ o很重要,测量jitting时间,运行调试版本,使用附加的调试器进行测试,以便禁用抖动优化器.

x64抖动使用您提到的相同技巧,它不是C++代码生成器所独有的:

00000030  xor         r9d,r9d 
... 
00000059  add         r9d,7
Run Code Online (Sandbox Code Playgroud)

.NET 4.5的一个新功能是Profile Guided Optimization.

未来的计划永远不会像微软这样的公司共享,没有必要猜测它们.


Jon*_*nna 3

是否有计划在未来的框架版本中改进 C# 抖动?

您是否想问,微软和 Xamarin 上个月是否确实举行过一次秘密会议,会上一致认为,虽然他们在过去十年中都在改善各自的不安,但从现在开始,他们厌倦了让事情变得更好,并且会不再打扰,MS 会重新分配每个人,而 Xamarin 会拒绝任何提交的改善抖动的补丁?

我想说这是不可能的,并且像世界上所有其他积极开发的软件项目一样,也有计划对其进行改进。

此外,如果我真的想尽快运行您提供的代码,我会手动将其优化为return 161315136;. 这样的代码可以证明在给定情况下实现 A 比实现 B 慢,但没有说明任一实现背后的人员应该将精力集中在哪里。