[英]Is there a way to get the .Net JIT or C# compiler to optimize away empty for-loops?
以下程序只運行十億次空循環並打印出運行時間。 我的機器需要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.