.NET CLR是否真的针对当前处理器进行优化?

45

当我阅读关于像C#或Java这样的JIT编译语言的性能时,作者通常会说它们理论上应该/可以超越许多本地编译的应用程序。 这个理论是因为本地应用程序通常只是为一个处理器系列(如x86)编译,因此编译器无法进行某些优化,因为它们可能不是所有处理器上真正的优化。 另一方面,CLR可以在JIT过程中进行特定于处理器的优化。

有没有人知道微软(或Mono)的CLR实际上是否在JIT过程中执行特定于处理器的优化? 如果是,那么是哪种类型的优化?


据我所知,现在并不是这样。 - zneak
1
一个阴谋论者也可以思考微软是否可以编写JIT代码,以便在软件在竞争对手的系统下运行时进行去优化,例如在x86 Mac上虚拟化,假设他们能够检测到它是Mac。 - AaronLS
8
MacBU为Microsoft每年带来约3.5亿美元的收入。对于Microsoft来说,Mac是一个盈利中心,是除了苹果公司本身以外全球最大的Mac软件提供商。这些事实如何符合你的阴谋论? - Eric Lippert
13
阴谋论以无视事实而臭名昭著。 - AaronLS
7个回答

28

2005年,David Notario在他的博客文章"JIT是否利用我的CPU?"中列出了几个特定的目标优化。我找不到任何关于新的CLR 4的信息,但我想应该包含了几个新项目。


4
哇,这真是个不错的发现。+1 - Andras Vass
博客中的引用:“我们不对代码进行向量化处理(这才是使用SSE2的真正优势)”。所以很遗憾,JIT并没有带来太多好处。 - colinfang
@colinfang 但很快就会:http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx - Den

8

我知道Mono中实现的一个特定于处理器的优化是将Mono.Simd调用编译为在支持SSE指令的处理器上运行的SSE指令。如果运行代码的处理器不支持SSE,则JIT编译器将输出等效的非SSE代码。


2
我想指出,我听到有人提到 JIT 编译语言可能比静态编译语言更快的主要原因与特定处理器指令无关。相反,动态程序状态的信息可以用于优化代码路径。例如,内联缓存 可以用来使虚拟方法调用大致与非虚拟方法调用一样快。这通常通过假设在特定的调用点上,该方法只在单一类型上被调用,并发出直接跳转到该实现的代码(如果后来证明此假设不成立,则重写代码)的方式来实现。

微软的CLR是否执行内联缓存? - dewald
@dewald - 据我所知,C#默认情况下方法不是虚拟的(与Java相反),因此我认为这对.NET来说不是很重要。然而,这只是一个例子,说明JIT可以在运行时进行难以或不可能静态实现的优化。 - kvb
2
@dewald - 请参考https://dev59.com/9HM_5IYBdhLWcg3wt1rD,了解CLR和JVM方法之间的对比。 - kvb
现在,虽然很多C++编译器可以执行基于配置文件的优化,但也可以进行这种优化。 - Aidiakapi

2
32位和64位的Jitter是不同的,这是一个起点。

据我理解,OP正在寻找处理器系列内的特定优化(例如,它是否根据当前处理器是基于NetBurst还是Core微架构,在32位模式下运行而生成特定代码?) - Mehrdad Afshari
@Mehrdad,我知道这不是主要方向,但我认为它值得一提。 - H H

2

.Net Framework运行时优化服务不仅优化编程问题(编译器的优化),还针对处理器进行优化。


1

我认为一些Java编译器支持,而Microsoft .NET不支持,在比较苹果和橙子时,只有在预编译的情况下才能胜过JIT。预编译可以随附针对不同CPU(或更可能是不同指令集)进行调整的库变体,并且运行时检查以选择要加载的库要比JIT便宜得多。例如,mplayer就是这样做的(Google搜索mplayer enable-runtime-cpudetection)。


你有支持你的说法的参考资料吗?不是在质疑,只是想知道这是个人观点还是有文献事实支持的。 - Eric J.
2
事实证明,微软.NET根据指令集进行了一些优化,但并没有考虑特定的CPU特征,例如缓存布局(http://blogs.msdn.com/davidnotario/archive/2005/08/15/451845.aspx)。然而,我关于预编译代码能够使用相同优化(以及更多在JIT编译器中难以找到的优化)的观点仍然成立。 - Ben Voigt

0

我知道关于内联函数的规则会因处理器类型(x86、x64)而变化。当然,指针大小也会根据它运行的位数(32位或64位)而有所不同。


是的,但指针大小始终会改变,无论您是否使用传统编译器。 - zneak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接