44

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

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

4

7 回答 7

27

早在 2005 年,David Notario 就在他的博客文章“ Does the JIT take advantage of my CPU? ”中列出了几个具体的针对性优化。我找不到关于新 CLR 4 的任何信息,但我想其中包括了几个新项目。

于 2010-03-08T23:13:14.560 回答
8

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

于 2010-03-08T22:44:36.557 回答
2

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

于 2010-03-08T22:47:26.467 回答
2

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

于 2010-03-08T22:54:21.373 回答
2

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

于 2010-03-09T15:02:54.170 回答
1

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

于 2010-03-08T22:46:41.653 回答
0

我知道是否内联函数的规则取决于处理器类型(x86、x64)。当然,指针大小会根据它运行为 32 位还是 64 位而有所不同。

于 2010-03-08T22:47:03.430 回答