当我阅读关于像C#或Java这样的JIT编译语言的性能时,作者通常会说它们理论上应该/可以超越许多本地编译的应用程序。 这个理论是因为本地应用程序通常只是为一个处理器系列(如x86)编译,因此编译器无法进行某些优化,因为它们可能不是所有处理器上真正的优化。 另一方面,CLR可以在JIT过程中进行特定于处理器的优化。
有没有人知道微软(或Mono)的CLR实际上是否在JIT过程中执行特定于处理器的优化? 如果是,那么是哪种类型的优化?
当我阅读关于像C#或Java这样的JIT编译语言的性能时,作者通常会说它们理论上应该/可以超越许多本地编译的应用程序。 这个理论是因为本地应用程序通常只是为一个处理器系列(如x86)编译,因此编译器无法进行某些优化,因为它们可能不是所有处理器上真正的优化。 另一方面,CLR可以在JIT过程中进行特定于处理器的优化。
有没有人知道微软(或Mono)的CLR实际上是否在JIT过程中执行特定于处理器的优化? 如果是,那么是哪种类型的优化?
2005年,David Notario在他的博客文章"JIT是否利用我的CPU?"中列出了几个特定的目标优化。我找不到任何关于新的CLR 4的信息,但我想应该包含了几个新项目。
我知道Mono中实现的一个特定于处理器的优化是将Mono.Simd
调用编译为在支持SSE指令的处理器上运行的SSE指令。如果运行代码的处理器不支持SSE,则JIT编译器将输出等效的非SSE代码。
.Net Framework运行时优化服务不仅优化编程问题(编译器的优化),还针对处理器进行优化。
我认为一些Java编译器支持,而Microsoft .NET不支持,在比较苹果和橙子时,只有在预编译的情况下才能胜过JIT。预编译可以随附针对不同CPU(或更可能是不同指令集)进行调整的库变体,并且运行时检查以选择要加载的库要比JIT便宜得多。例如,mplayer就是这样做的(Google搜索mplayer enable-runtime-cpudetection)。
我知道关于内联函数的规则会因处理器类型(x86、x64)而变化。当然,指针大小也会根据它运行的位数(32位或64位)而有所不同。