【问题标题】:Does .NET JIT optimize empty loops away?.NET JIT 会优化空循环吗?
【发布时间】:2009-02-11 22:02:46
【问题描述】:

This article 另有建议。但是仍然需要评估循环条件。 java 是否只是采用特定的技巧来识别这种情况?

【问题讨论】:

  • 您可以判断您手头是否有 C# 编译器。如果你不这样做,我想知道你对优化有什么兴趣?
  • 也许我远离带有 C# 编译器的计算机? :)

标签: c# .net performance jit


【解决方案1】:

查看您引用的文章的follow-up story

回答的人注意:看来 OP 询问的是 .NET JIT,而不是 Java JIT,因为引用的文章表明 Java 在优化空循环方面做得更好(或者只有 Java 做得更好。

编辑:谷歌搜索更多答案,Jon Skeet 的名字不断出现。例如,参见this thread on C# optimizations。因此,当他回答时,我们将有权威的答案! :-)

【讨论】:

    【解决方案2】:

    会的。

    http://www.javaspecialists.eu/archive/Issue158.html

    至少在 Java 5 和 6 中。您链接到的文章是关于较旧的 VM。

    【讨论】:

    • 然而,OP 似乎在询问 C# JIT,而不是 Java JIT。
    【解决方案3】:

    这篇文章来自 2003 年。从那时起,CLI(和 java VM)有了很大的进步。一般来说,在进行微基准测试时,您必须非常谨慎。最终测量 jit 性能、消除死代码时的编译器效率、时序开销、垃圾收集等非常容易。

    【讨论】:

      【解决方案4】:

      Java 并不总是优化空循环的方式。在这种情况下,计算 4 个 BN 数字需要 2.966 秒。

      long start = System.nanoTime();
      for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++);
      long time = System.nanoTime() - start;
      System.out.printf("Took %.3f seconds to empty loop.%n", time * 1e-9);
      

      打印

      Took 2.966 seconds to empty loop.
      

      这是使用Java 6u11,也许6u14会更聪明。

      【讨论】:

      • 您可能必须使用 -server 虚拟机而不是(默认)-client 虚拟机来获得更高级的优化,例如这个。
      【解决方案5】:

      一般来说,尽可能简单地编写代码,以便 JVM 可以很好地猜测您要执行的操作。

      【讨论】:

      • 这是一个关于 .NET 的问题。他问的不是 JVM,而是 .NET CLR。​​
      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2016-11-26
      • 2011-11-09
      • 2014-10-09
      • 2018-06-25
      相关资源
      最近更新 更多