C # derleyicisi yayımlanmış IL'yi Release derlemesinde çok fazla değiştirmez. Dikkat çeken şey, artık kıvırcık bir küme üzerinde bir kesme noktası ayarlamanıza izin veren NOP opcodlarını yaymamasıdır. Büyük olan, JIT derleyicisine yerleştirilmiş eniyileştiricidir. Aşağıdaki optimizasyonları yaptığını biliyorum:
Yöntem satır içi. Bir yöntem çağrısı, yöntemin kodunun enjekte edilmesi ile değiştirilir. Bu büyük bir özelliktir, mülk erişimcilerini esasen ücretsiz hale getirir.
CPU kayıt tahsisi. Yerel değişkenler ve yöntem bağımsız değişkenleri, yığın karesine hiç (veya daha az sıklıkta) depolanmadan CPU kaydında saklanabilir. Bu büyük bir, hata ayıklama optimize kod çok zor hale getirmek için dikkate değer. Ve uçucu anahtar kelimeye bir anlam vermek.
Dizi dizini denetiminin kaldırılması. Dizilerle çalışırken önemli bir optimizasyon (tüm .NET koleksiyonu sınıfları dahili olarak bir dizi kullanır). JIT derleyicisi, bir döngünün bir diziyi hiçbir zaman sınırların dışında dizine eklemediğini doğrulayabildiğinde, dizin denetimini ortadan kaldırır. Büyük olan.
Döngü açma. Küçük gövdeli döngüler, kodu vücutta 4 kata kadar tekrarlayıp daha az döngü yaparak geliştirilir. Şube maliyetini azaltır ve işlemcinin süper skaler yürütme seçeneklerini iyileştirir.
Ölü kod ortadan kaldırılması. İf (false) {/ ... /} gibi bir deyim tamamen ortadan kaldırılır. Bu, sürekli katlama ve eğim nedeniyle oluşabilir. Diğer durumlarda, JIT derleyicisinin kodun olası bir yan etkisi olmadığını belirleyebildiği yerdir. Bu optimizasyon, profil oluşturma kodunu bu kadar zor yapan şeydir.
Kod kaldırma. Döngüden etkilenmeyen bir döngü içindeki kod döngüden çıkarılabilir. Bir C derleyicisinin optimize edicisi, kaldırma fırsatları bulmak için çok daha fazla zaman harcayacaktır. Bununla birlikte, gerekli veri akışı analizi nedeniyle pahalı bir optimizasyondur ve titreşim zamanı karşılayamaz, bu nedenle sadece bariz vakaları kaldırır. .NET programcılarını daha iyi kaynak kodu yazmaya ve kendilerini kaldırmaya zorlama.
Ortak alt ifade eliminasyonu. x = y + 4; z = y + 4; z = x olur; Dest [ix + 1] = src [ix + 1] gibi ifadelerde oldukça yaygındır; yardımcı değişken girmeden okunabilirlik için yazılmıştır. Okunabilirlikten taviz vermenize gerek yok.
Sabit katlama. x = 1 + 2; x = 3 olur; Bu basit örnek derleyici tarafından erken yakalanır, ancak diğer optimizasyonların bunu mümkün kıldığı JIT zamanında olur.
Kopya yayılımı. x = a; y = x; y = a olur; Bu, kayıt tahsisatörünün daha iyi kararlar almasına yardımcı olur. Bu, x86 titreşiminde büyük bir anlaşma çünkü çalışmak için çok az kaydı var. Doğru olanları seçmek mükemmel olmak için çok önemlidir.
Bunlar, örneğin uygulamanızın Hata Ayıklama derlemesini profillediğinizde ve Sürüm derlemesiyle karşılaştırdığınızda büyük fark yaratabilecek çok önemli optimizasyonlardır . Bu sadece kod kritik yolunuzdayken gerçekten önemlidir, yazdığınız kodun% 5 ila 10'u aslında programınızın performansını etkiler. JIT optimizer ne kritik ön bilmek yeterince akıllı değil, sadece tüm kod için "onbir çevirmek" kadranı uygulayabilirsiniz.
Bu optimizasyonların programınızın yürütme süresindeki etkili sonucu genellikle başka yerlerde çalışan kodlardan etkilenir. Bir dosyayı okuma, bir dbase sorgusu yürütme, vb. JIT optimizer'ın çalışması tamamen görünmez olur. Gerçi umursamıyor :)
JIT iyileştirici, çoğunlukla milyonlarca kez test edildiğinden oldukça güvenilir bir koddur. Programınızın Release derleme sürümünde sorun olması son derece nadirdir. Ancak olur. Hem x64 hem de x86 titremelerinin yapılarla ilgili sorunları vardı. X86 titreşimi, kayan nokta tutarlılığı ile ilgili sorun yaşar ve kayan nokta hesaplamasının ara maddeleri, bir FPU kaydında, belleğe akıtıldığında kesilmek yerine 80 bit hassasiyette tutulduğunda oldukça farklı sonuçlar üretir.