【问题标题】:Does the .NET CLR Really Optimize for the Current Processor.NET CLR 是否真的针对当前处理器进行了优化
【发布时间】:2010-03-09 23:02:54
【问题描述】:

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

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

【问题讨论】:

  • 据我所知,目前还没有。
  • 如果软件在竞争对手的系统下运行,例如在 x86 Mac 上虚拟化,假设他们可以检测到它是Mac。
  • @aaronls:MacBU 每年为 Microsoft 带来的收入估计为 3.5 亿美元。 Mac 是微软的利润中心,微软是苹果公司之外世界上最大的 Mac 软件供应商。这些事实如何符合您的阴谋论?
  • @Eric 阴谋论因忽视事实而臭名昭著。

标签: c# .net optimization clr jit


【解决方案1】:

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

【讨论】:

  • 哇。这是一个不错的发现。 +1
  • 引自博客:“我们不向量化代码(这是 SSE2 的真正胜利)”。很遗憾,JIT 并没有太多优势。
  • @colinfang 但很快就会:blogs.msdn.com/b/dotnet/archive/2014/04/07/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 据我了解这个问题,OP 正在寻找处理器特定的优化在处理器系列中(例如,它是否根据当前处理器生成特定代码是基于 NetBurst vs . 核心微架构,都运行在 32 位模式?)
    • @Mehrdad,我知道这不是主要方向,但我认为值得一提。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 微软的 CLR 是否执行内联缓存?
      • @dewald - 我不知道,但我相信有几个 Java VM 可以。由于默认情况下 C# 中的方法不是虚拟的(与 Java 不同),我认为这对于 .NET 来说是较低的优先级。但是,这只是 JIT 如何在运行时进行难以或不可能静态进行优化的一个示例。
      • @dewald - 有关 CLR 和 JVM 方法之间对比的更多信息,请参阅 stackoverflow.com/questions/1255803/…
      • 现在虽然很多 C++ 编译器可以进行配置文件引导优化,但也可以进行这种优化。
      【解决方案6】:

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

      【讨论】:

      • 您是否有参考资料来支持您声称 MS .NET 没有的说法?不质疑它,只是想知道这是观点还是记录在案的事实。
      • 好吧,事实证明,Microsoft .NET 基于指令集而不是缓存布局等特定 CPU 特性进行了一些优化 (blogs.msdn.com/davidnotario/archive/2005/08/15/451845.aspx)。不过,我关于预编译代码能够使用相同优化(以及在 JIT 编译器中难以找到的更多优化)的观点仍然成立。
      【解决方案7】:

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

      【讨论】:

      • 是的,但无论您是否使用传统编译器,指针大小总是会发生变化。
      猜你喜欢
      • 2011-03-22
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多