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

标签 c# .net clr jit compiler-optimization

Does .NET JIT optimize empty loops away? 的跟进:

下面的程序只运行一个空循环十亿次并打印出运行时间。在我的机器上需要 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);
        }
    }
}

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

似乎这对于 JIT 来说很容易找到并优化掉,但对抖动的一般工作原理知之甚少,我很好奇这种优化是否有特定原因被排除在外。此外,VC++ 编译器似乎确实进行了这种优化,所以我想知道为什么会出现这种差异。有什么想法吗?

最佳答案

不,我所知道的 .NET 抖动都没有消除空 for 循环。我不清楚的确切原因是,抖动优化器当然知道如何进行这样的优化并轻松消除死代码。检查this answer了解详情。我相信这是有意的,因为它可能会产生预期的副作用,所以会保留循环,从而耗费时间。这当然只对实现自旋等待的非常短的循环有意义。

关于c# - 有没有办法让 .Net JIT 或 C# 编译器优化掉空的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7288428/

相关文章:

c# - 在 C# 中验证小数以在 SQL Server 中存储

.net - 您可以在线程池中排队的工作项数量是否有限制?

c# - 为此 : 使用 linq

c# - 按长度拆分字符串到 Excel

c# - 在 C# 中以编程方式创建 DHCP 预留

c# - 为什么我不能在 asp.net 上使用 ToShortDateString

c# - 如何连接到 Cassandra 虚拟机

.net - .NET 中的非通用集合是否已过时?

c# - linq 查询的返回数据类型

c# - 字符串类型和字符串类型有什么区别? (首字母大写)