.NET CLR是否真的为当前处理器优化?
当我读到像C#或Java这样的JITted语言的性能时,作者们通常会说理论上它们应该胜过许多本地编译的应用程序。 理论上说,本地应用程序通常只是针对处理器系列(如x86)进行编译,因此编译器无法进行某些优化,因为它们可能不会真正在所有处理器上进行优化。 另一方面,CLR可以在JIT过程中进行特定于处理器的优化。
有谁知道微软的(或者Mono的)CLR是否真的在JIT过程中执行特定于处理器的优化? 如果是这样,什么样的优化?
从2005年开始,David Notario列举了几个具体的目标优化,即他的博客文章“ JIT是否充分利用了我的CPU? ”。 我找不到有关新CLR 4的任何内容,但是我想象中包含了几个新的项目。
一个处理器的具体优化我知道这是在单声道完成正在编译Mono.Simd
调用的 SSE指令支持SSE的处理器上。 如果运行代码的处理器不支持SSE,则JIT编译器将输出等效的非SSE代码。
32位和64位抖动是不同的,这是一个开始。
.Net Framework运行时优化服务不仅优化了编程问题(编译器的优化),还优化了处理器。
我将指出,我所听到的引起JIT编译语言潜力超过静态编译语言的主要原因与处理器特定的指令无关。 相反,关于程序dynamic状态的信息可以用来优化代码path。 例如, 内联caching可以用来使虚拟方法调用与非虚方法调用一样快。 粗略地说,这是通过假设在一个特定的调用站点上,这个方法只在一个types上被调用,并发出直接跳转到那个实现的代码(然后如果这个假设没有在后面出现的话,那么重写代码)。
我认为有些Java编译器是这样做的,Microsoft .NET不支持,而且只有在将苹果与橙子进行比较时,它才会进行预编译。 预编译可以提供一个调整到不同CPU(或更可能是不同的指令集)的库变体,运行时检查select加载哪个库比JIT便宜很多。 例如,mplayer这样做(谷歌mplayer enable-runtime-cpudetection)。
我知道是否内联函数的更改取决于处理器types(x86,x64)。 当然,指针的大小将根据它是以32位还是64位运行而变化。