未来框架版本中的C#抖动改进
我注意到,即使没有使用“托管开销”构造(如带有检查索引的数组),C#抖动也会产生比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.88s来执行(与/ O编译)。使用VC 2010(-O2)编译的等效循环需要2.95秒。
为了验证实际生成的劣质代码,我比较了机器代码:从VC编译器创建了一个列表(/ FAs),并将一个调试器附加到C#程序(循环完成后)。
事实上,C++版本正在使用一些聪明的技巧。例如,为了避免成本增加7,有一个单独的寄存器,每个循环计数增加7。 C#版本每次都会执行乘法(imul)。还有其他的不同之处。
我知道C#jitter在编译时比运行时编译代码的时间要少很多。但例如Java抖动是动态优化常用的方法。 C#似乎并没有这样做。
我的问题是:是否有计划在未来的框架版本中改进C#抖动?
是否有计划在未来的框架版本中改进C#抖动?
你是问,如果有,其实它同意微软和Xamarin之间的秘密会谈上个月,虽然他们俩都度过了过去十年提高各自的恐慌,从现在起,他们生病的让事情变得更好,而且不会再烦恼了,MS会重新分配每个人,而Xamarin会拒绝任何提交抖动的提交补丁。
我想说这是不太可能的,就像世界上其他所有积极开发的软件项目一样,有计划改进它。
此外,如果我真的想要尽快运行您的代码,我会手动优化它到return 161315136;
。这样的代码可以证明在特定情况下,实现A比实现B慢,但没有说明任何实现背后的人应该集中精力。
这段代码是为了证明C#抖动是C#比C++慢的原因,而不仅仅是许多人(包括Herb Sutter)提到的“管理开销”。显然,性能比简单的整数操作和分支要多得多。 – kaalus 2012-08-16 19:32:28
是的,但除了@HansPassant得到的结果之外,还有一个问题是它有多相关。对于抖动团队来说,这是否是必要的?如果他们这样做了,他们中的任何一个人都可以写出一些有趣的内容吗?我可以想象它会根据“我们做了一些其他的改进”,在这些问题的文章中获得,而不是他们成为一个关于循环中的乘法运算更快的博客帖子。 – 2012-08-16 19:35:46
我认为通过改进C#抖动可以带来显着的收益。我希望在计算机语言基准游戏(http://shootout.alioth.debian.org)上看到C#匹配或超越Java。 C#具有原生值类型,而且在大多数情况下Java的速度要快得多,真是令人遗憾。虽然他们使用Mono进行测试,但不是在那里执行MS。 – kaalus 2012-08-16 19:40:06
发布版本,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时间,运行调试版本,附加了调试器测试所以抖动优化器被禁用。
的64位抖动使用你所提到的同样的伎俩,它不是唯一的C++代码生成器:
00000030 xor r9d,r9d
...
00000059 add r9d,7
一个新特性,.NET 4.5是profile指导的优化。
未来的计划永远不会像微软这样的公司共享,并且没有必要猜测他们。
这应该是公认的答案。 – hoodaticus 2017-06-23 14:43:20
Visual Studio RC 2012与.NET 4。5可以从昨天开始下载。下载它(它是免费的)并在那里运行相同的测试。 – 2012-08-16 14:47:02
很久以前,我已经停止屏住呼吸,看看由抖动完成的新优化。 MS似乎认为这个部门足够好。 – harold 2012-08-16 17:57:56
@harold从何时起? – 2012-08-16 18:43:15