2011-09-02 26 views
11

Does .NET JIT optimize empty loops away? için bir izleme:Boş for-döngüler için optimize etmek için .Net JIT veya C# derleyicisi almak için bir yolu var mı?

Aşağıdaki program, boş bir döngüyü milyarlarca kez çalıştırır ve çalıştırılacak zamanı yazdırır. Makinemde 700 ms sürüyor ve boş döngüyü en iyi duruma getirmek için jitter almanın bir yolu olup olmadığını merak ediyorum.

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

Bildiğim kadarıyla söyleyebilirim cevap hayır, ama ben denedim olmayabilir gizli derleyici seçenekleri varsa bilmiyorum. Serbest bırakma modunda derlemeyi ve hata ayıklayıcı eklenmeden çalışmayı tamamladım, ancak bu boş döngüyü çalıştırmak için hala 700 ms çekiliyor. Aynı sonuca sahip NGEN'i de denedim (yine de benim anlayışım JIT ile aynı derlenmiş kodu üretmeli, doğru mu?). Ancak NGEN'i daha önce hiç kullanmadım ve yanlış kullanıyor olabilirim.

O bu optimizasyon dışında kalan olurdu belirli bir sebebi varsa böyle, merak ediyorum bulup uzağa optimize ancak gerginlik genelde nasıl çalıştığı hakkında çok az şey bilerek JIT için kolay bir şey olurdu görünüyor . Ayrıca, VC++ derleyicisi kesinlikle bu optimizasyonu yapıyor gibi görünüyor, bu yüzden neden farklı olduğunu merak ediyorum. Herhangi bir fikir?

+6

Bu neden sizin için gerçek bir mesele? Boş bir döngünün varsa, ondan kurtul. –

+0

Bu, referans verdiğiniz sorudan farklı mıdır? –

+0

@Belirtiyorum java sunucu ve istemci gibi JIT seçenekleri vardır. Referans soru, jitter'i optimize etmeyi sağlayan seçeneklerle ilgili herhangi bir şey sormuyor. –

cevap

7

Hayır, bildiğim .NET sorunları hiçbiri döngüler için boş olanları ortadan kaldırmaz. Bana neden bu kadar açık olmamanın tam nedeni, jitter optimizer kesinlikle böyle optimizasyonlar yapmayı ve ölü kodun nasıl kolayca ortadan kaldırılacağını bilir. Ayrıntılar için this answer'a bakın. Bunun kasıtlı olduğuna inanıyorum, döngüleri muhtemelen beklenen yan etkisi ve zaman kaybı için yerinde bırakıyor. Elbette bir spinwait uygulamak için çok kısa döngüler için hangisi mantıklıdır.

+3

Bu bir tür garip mantık olsa da. Kodu optimize etmenin tüm amacı, daha az zaman harcamasını sağlamaktır.Eğer harcanan zamanın miktarını korumaya karar verirseniz, bu, tüm optimizasyon fikrini baltalamaktadır. – jalf

+4

Bir spinwait bir optimizasyon. –

+0

Boş döngüyü görmek, program döngüsünü hızlandırmak için CPU zamanlamasına bağlı olarak gecikmeleri tanıtmak için boş döngüler kullanan kötü yazılmış eski okul DOS programlarını hatırlatır. Gerçekten eski oyunları çalıştıran DOS öykünücülerinin, bazen, oyunun gülünç kare hızlarında güncellenmeyeceği şekilde, bilerek CPU yürütme işlemini kısaltması gerekir. –