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



.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);
        }
    }
}

据我所知答案是否定的,但我不知道是否有隐藏的编译器选项,我可能没有尝试过。我已经确保在发布模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒来运行这个空循环。我也尝试了NGEN,得到了相同的结果(尽管我的理解是它应该产生与JIT相同的编译代码,对吧?)然而,我以前从未使用过NGEN,可能使用错误。

看起来这对于JIT来说是很容易找到和优化的,但是对于抖动是如何工作的了解很少,我很好奇是否有一个特定的原因会忽略这个优化。此外,vc++编译器确实似乎做了这个优化,所以我想知道为什么差异。什么好主意吗?

不,我所知道的。net抖动都不会消除空的for循环。确切的原因我不太清楚,抖动优化器当然知道如何进行这样的优化,并很容易地消除死代码。请查看以下答案了解详情。我相信这是有意为之的,因为它可能会产生副作用,耗费时间。当然,只有在非常短的循环中实现spinwait才有意义。

最新更新