簡體   English   中英

有沒有辦法讓.Net JIT或C#編譯器優化掉空的for循環?

[英]Is there a way to get the .Net JIT or C# compiler to optimize away empty for-loops?

.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的非常短的循環來說是有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM