有没有办法让.Net JIT或C#编译器优化掉空的for循环?

Dax*_*ohl 11 .net c# clr jit compiler-optimization

后随以不.NET JIT优化空循环走?:

以下程序只运行十亿次空循环并打印出运行时间.我的机器需要700毫秒,我很好奇是否有办法让抖动优化掉空循环.

using System;

namespace ConsoleApplication1 {
    class Program {
        static void Main() {
            var start = DateTime.Now;
            for (var i = 0; i < 1000000000; i++) {}
            Console.WriteLine((DateTime.Now - start).TotalMilliseconds);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,答案是否定的,但我不知道是否有隐藏的编译器选项,我可能没试过.我确保在发布模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒才能运行此空循环.我也试过NGEN同样的结果(虽然我的理解是它应该生成与JIT相同的编译代码,对吧?).但是我之前从未使用过NGEN,可能使用错了.

看起来像这将是一些容易的JIT发现和优化掉,但是了解甚少抖动一般是如何工作的,我很好奇,如果有这种优化将遭到冷落具体原因.VC++编译器肯定似乎做了这个优化,所以我想知道为什么会出现这种差异.有任何想法吗?

Han*_*ant 8

不,我所知道的.NET抖动都没有消除for循环.确切的原因对我来说并不清楚,抖动优化器肯定知道如何进行这样的优化并且很容易消除死代码.请查看此答案以获取详细信 我认为这是故意的,因为它可能有用的副作用留下了循环,耗费时间.当然,这对于实现spinwait的非常短的循环来说是有意义的.

  • spinwait是一种优化. (4认同)
  • 这虽然是一种奇怪的逻辑.优化代码的重点是让它消耗更少的时间.如果你决定保留花费的时间,那就会破坏整个优化的想法. (3认同)
  • @jalf:我听到的最好表达的是"如果CPU时间的使用包含在*可观察行为*中,则禁止所有优化". (3认同)