未来框架版本中的C#抖动改进 我注意到C抖动比C++编译器产生的代码慢得多,即使没有使用“托管开销”结构(如带有检查索引的数组)。

未来框架版本中的C#抖动改进 我注意到C抖动比C++编译器产生的代码慢得多,即使没有使用“托管开销”结构(如带有检查索引的数组)。,c#,optimization,jit,C#,Optimization,Jit,为了量化它,我对以下简单循环计时: 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; } 公共静态整数计数=100000000; 公共静态

为了量化它,我对以下简单循环计时:

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;
}
公共静态整数计数=100000000;
公共静态int Main()
{
int j=0;
对于(int i=0;i>3):(i*7);
}
返回j;
}
此循环需要3.88秒才能执行(使用/o编译)。使用VC 2010(-O2)编译的等效循环需要2.95秒

为了验证是否确实生成了低级代码,我比较了机器代码:从VC编译器创建了一个清单(/FAs),并在C#程序上附加了一个调试器(在循环完成后)

确实,C++版本使用了一些巧妙的技巧。例如,为了避免昂贵的乘法7,有一个单独的寄存器,每个循环计数递增7。C版本每次都进行乘法运算(imul)。还有其他不同之处

我知道C#jitter在运行时编译代码的时间比在构建时编译代码的时间少得多。但是,例如Java抖动正在动态优化常用的方法。C#似乎没有这么做

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

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

你是在问上个月微软和Xamarin之间是否真的有过一次秘密会议,会上双方一致认为,虽然他们在过去十年中都在改善各自的紧张情绪,但从现在起,他们已经厌倦了让事情变得更好,不再费事了,MS会重新分配所有人,而Xamarin会拒绝提交任何改善抖动的补丁

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


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

发布版本,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的一个新功能是配置文件引导优化


未来的计划从未被微软这样的公司分享过,也没有必要去猜测它们。

Visual Studio RC 2012 with.NET 4.5从昨天开始就可以下载了。下载它(它是免费的)并在那里运行相同的测试。我很久以前就不再为jitter所做的新优化屏住呼吸了。“微软似乎认为在那个部门它已经足够好了。”JonHanna自.NET4。3.5有一些好的东西,认为不太多,但是NGEN得到了所有的爱。@哈罗德,在4中进行尾调用消除的更大的情况不是NGEN。你的测试是手工挑选的,显示一个C++比C语言快的特定情况。我从未见过这种情况出现在我编写的代码中,所以JIT如何处理它对我来说并不重要。如果你再次运行你的测试,但是把注意力放在内存分配器上(每个人都使用它几乎无处不在),我想你会发现结果惊人的不同。这个代码是为了证明C++的抖动是C语言慢于C++的原因,而不仅仅是很多人(包括Habor萨特)提到的“管理开销”。显然,性能不仅仅是简单的整数运算和分支。是的,但是除了@HansPassant得到的结果外,还有一个问题是它的相关性有多大。这是否一定是jitter团队需要投入努力的情况?如果他们真的这么做了,他们中的任何一个人都会觉得有趣吗?我想这应该是你在这类文章中看到的“我们做了一些其他的改进”这一行,而不是一堆关于循环乘法速度加快的博客文章。我认为通过改进C#jitter可以获得显著的收益。我希望看到C#在计算机语言基准测试游戏()中与Java匹敌或超越Java。C#具有本机值类型,Java在大多数情况下速度要快得多,这真是太遗憾了。虽然他们测试的是Mono,但不是MS实现。我也这么认为。我不明白的是,为什么你怀疑微软和Xamarin可能不会呢?.NET已经有10多年的历史了,经历了许多修改,但自早期以来,jitting部门的变化不大。请随意告诉我我错了——但事实仍然是,Java在理论上应该更糟糕,但它仍然遥遥领先。如果微软表现得更好,微软可能不会觉得被迫用Windows 8进行C++转换。