2012-12-06 21 views
9

Yayınlama modunda Derleme modunun Debug modundan daha iyi bir kod oluşturduğunu duydum, bu da gayet iyi.Farklı IL kodu + farklı makine kodu oluşturmak için Sürüm ve Hata Ayıklama derleniyor mu?

Bu IL'deki bu optimizasyon mu? CLR çalıştığında makine kodunda mı? Release ve Debug'da derlenen PE'den farklı meta veri yapısı mı?

sayesinde

+0

İyi soru, ama neden bilmek istiyorsun? – Cameron

+2

Çünkü bir iş görüşmesinde reddedildim ve sinirlendim. Geliştiricilerin, bu şeylerin sahne arkasında nasıl çalıştığını daha fazla bilmeleri gerektiğini düşünüyorum. – RollRoll

+0

Büyük soru! – nawfal

cevap

14

Building in Release derlemesi, C# derleyicisi için/optile derleme seçeneğini açar. Bu, az sayıda yan etkiye sahiptir, IL gerçekten değişiyor ama büyük bir şey değil. Unutulmamalıdır ki derleyici artık kodu mükemmel bir şekilde hata ayıklamak için çaba harcamaz. Örneğin, boş bir statik yapıcıyı atlar, artık bir kaşlı ayraç üzerinde bir kesme noktası ayarlamanıza ve bir yığın çerçevesinde üst üste çakışan farklı değişkenlere sahip yerel değişkenlere izin veren NOP işlem kodlarını çıkarmaz. Önemsiz şeyler.

En önemli fark, derleme için yayımlanan [Debuggable] özniteliğidir, IsJITOptimizerDisabled özelliği yanlıştır.

gerçek en iyi duruma getirici, jitter içine yerleşik olan en iyi duruma getirici. this answer'da gerçekleştirdiği optimizasyonların listesini bulacaksınız. Bu yaklaşımın yararlılığını, herhangi bir dil faydasının, kod iyileştiricisinin derleyici yerine jitter'e sahip olmasına dikkat edin. Kısaca, IL'deki çok küçük değişiklikler, oluşturulan makine kodunda çok büyük değişiklikler.

+2

harika cevap. – RollRoll

3

Evet, IL içinde bazı optimizasyon var - özellikle de ayıklama sürümü kolay bir ayıklayıcı mola noktaları eklemek için yapmak NOP talimatları içerecektir, inanıyorum. Ayrıca, sağlanan hata ayıklama bilgisi seviyesi açısından da farklılıklar vardır (satır numaraları vb.).

Küçük bir örnek program almanızı, her iki şekilde derlemenizi ve sonra çıktısını ildasm ürününe bakmanızı öneririm.

C# derleyicisi çok optimizasyon yapmaz - JIT derleyicisi bu çoğu yok - ama sanırım bazı farklılıklar vardır.

+0

teşekkürler, meta veri yapısının derleme moduna bağlı olarak değişip değişmediğini bilmek ister misiniz? – RollRoll

+0

@EdwinSoho: Yine aynı * format *. Gerçekten "yapı" ile ne demek istediğine bağlı. –

1

Takım farklıdır, optimize edilmiştir. Makine kodu cil'in bir çevirisi olduğundan, aynı zamanda farklıdır. Bunu kendi başınıza görebilir, görsel stüdyodaki sökme penceresini açabilirsiniz. Meta veriler, sürümler arasındaki sınıf sözleşmelerinin yapısını değiştirmediğinizde aynı kalmalıdır.

0

VB'de, yürütülebilir belleğe neden olan Düzen + Devam desteğinin bir yan etkisi vardır; bu da bellek sızıntısına neden olabilir. WithEvents anahtar sözcüğü ile bildirilen herhangi bir olaydan etkilenir. Bir WeakReference bu olay örneklerini takip eder. Sorun, uygulamayı bir hata ayıklayıcı olmadan çalıştırırsanız, WeakReferences sızdırılmış olmasıdır. Sürecin belleği harcadığı hız, sınıfın kaç örneğinin oluşturulmasına bağlı. Sızıntı, nesne başına olay başına 16 bayttır.

Yasal Uyarı: here

this Microsoft knowledge base article Bkz Hans'ın cevap kopyalanan.

0

Bu, sorunun tam olarak bir cevabı değildir.Sadece hangi kodun hata ayıklama modunda çalıştırılacağını ve önişlemci işaretlemeleri yardımıyla hangi sürüm modunda çalıştırılacağını ekleyebilmek için ekleyebilirsiniz.

#if DEBUG 
    // code only meant for debug mode 
#endif 

#if NOT DEBUG 
    // code only meant for release mode 
#endif 

Eğer bunu yaparsanız, farklı IL üretilir.

İlgili konular