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

时间:2010-03-08 22:39:18

标签: c# .net optimization clr jit

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

有人知道微软(或Mono)的CLR是否在JIT过程中实际执行特定于处理器的优化?如果是这样,有什么样的优化?

7 个答案:

答案 0 :(得分:27)

从2005年开始,David Notario列出了几个具体的目标优化是他的博客条目“Does the JIT take advantage of my CPU?”。我找不到关于新CLR 4的任何信息,但我想会包括几个新项目。

答案 1 :(得分:8)

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

答案 2 :(得分:2)

32位和64位抖动是不同的,这是一个开始。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我要指出,我听到的主要原因是JIT编译语言的性能优于静态编译语言,这与处理器特定指令无关。相反,它是关于程序动态状态的信息可用于优化代码路径。例如,inline caching可用于使虚拟方法调用与非虚方法调用一样快。粗略地说,这可以通过假设在特定的调用站点上调用该方法仅在单个类型上调用并发出直接跳转到该实现的代码(如果此假设不会在以后出现,则重写代码)。

答案 5 :(得分:1)

我认为有些Java编译器会这样做,而Microsoft .NET则没有,而且只有在将苹果与橙子进行比较时才会进行预编译。预编译可以附带调整到不同CPU(或更可能是不同的指令集)的库变体,并且运行时检查以选择要加载的库比JIT便宜得多。例如,mplayer执行此操作(google for mplayer enable-runtime-cpudetection)。

答案 6 :(得分:0)

我知道内联函数是否根据处理器类型(x86,x64)而变化的规则。当然,指针大小将根据它是以32位还是64位运行而变化。