Hata ayıklama ve Yayın performansı


132

Aşağıdaki paragrafla karşılaştım:

"Kodunuzu Visual Studio'da derlediğinizde IDE'de hata ayıklama ve yayınlama ayarı performansta neredeyse hiçbir fark yaratmaz… üretilen kod hemen hemen aynıdır. C # derleyicisi gerçekten herhangi bir optimizasyon yapmaz. C # derleyici sadece IL'yi tükürür… ve çalışma zamanında tüm optimizasyonu yapan JITer'dır. JITer'in Hata Ayıklama / Yayın modu vardır ve bu, performansta büyük bir fark yaratır. Ancak bu, projenizin Hata Ayıklama veya Yayın yapılandırmasını çalıştırıp çalıştırmamanızı engellemez, bir hata ayıklayıcının eklenip eklenmediğini iptal eder. "

Kaynak burada ve podcast burada .

Birisi beni bunu gerçekten kanıtlayabilecek bir Microsoft makalesine yönlendirebilir mi?

Googling " C # hata ayıklama ve sürüm performansı ", çoğunlukla " Hata ayıklama performansında çok fazla darbe aldı ", " sürüm optimize edildi " ve " hata ayıklamayı üretime dağıtmayın " şeklinde sonuçlar döndürür .



Win7-x86 üzerinde .Net4 ile, ana döngüde / etc olmadan hata ayıklamadan neredeyse 2 kat daha hızlı çalışan, yazdığım bir CPU sınırlı programım var.
Bengie

Ayrıca, hafıza kullanımını önemsiyorsanız, büyük farklılıklar olabilir. Hata Ayıklama modunda derlenen çok iş parçacıklı bir Windows hizmetinin Sürüm yapısında iş parçacığı başına 50 MB yerine iş parçacığı başına 700 MB kullandığı bir durum gördüm. Hata Ayıklama derlemesi, tipik kullanım koşullarında bellek yetersiz kaldı.
o. nate

@Bengie - yayın yapısına bir hata ayıklayıcı eklerseniz, hala 2 kat daha hızlı çalıştığını doğruladınız mı? Yukarıdaki alıntı, JIT optimizasyonunun hata ayıklayıcının eklenip eklenmemesinden etkilendiğini söylüyor.
ToolmakerSteve

Yanıtlar:


99

Kısmen doğru. Hata ayıklama modunda, derleyici tüm değişkenler için hata ayıklama sembolleri yayar ve kodu olduğu gibi derler. Yayın modunda, bazı optimizasyonlar dahildir:

  • kullanılmayan değişkenler hiç derlenmez
  • Bazı döngü değişkenleri, değişmez oldukları kanıtlanırsa derleyici tarafından döngüden çıkarılır
  • #debug yönergesi altında yazılan kod dahil değildir, vb.

Gerisi JIT'e kalmış.

Optimizasyonların tam listesi Eric Lippert'in izniyle burada .


10
Ve Debug.Asserts'ı unutma! DEBUG yapısında, başarısız olurlarsa, iş parçacığını durdurur ve bir mesaj kutusu açar. Sürümde hiç derlenmezler. Bu, [ConditionalAttribute] içeren tüm yöntemler için geçerlidir.
Ivan Zlatanov

13
C # derleyicisi kuyruk çağrısı optimizasyonları yapmaz; jitter yapar. En iyi duruma getirme
Eric Lippert

63

Performans sorusu hakkında herhangi bir şeyi "kanıtlayan" bir makale yoktur. Bir değişikliğin performans etkisine ilişkin bir iddiayı kanıtlamanın yolu, onu her iki şekilde de denemek ve gerçekçi ama kontrollü koşullar altında test etmektir.

Performans hakkında bir soru soruyorsunuz, bu yüzden açıkça performansı önemsiyorsunuz. Performansı önemsiyorsanız, yapılacak doğru şey, bazı performans hedefleri belirlemek ve ardından kendinize bu hedeflere yönelik ilerlemenizi izleyen bir test paketi yazmaktır. Böyle bir test paketine sahip olduğunuzda, "hata ayıklama yapısı daha yavaştır" gibi ifadelerin doğruluğunu veya yanlışlığını kendiniz test etmek için kolayca kullanabilirsiniz.

Ve dahası, anlamlı sonuçlar alabileceksiniz. "Daha yavaş" anlamsızdır çünkü bir mikrosaniye daha yavaş mı yoksa yirmi dakika daha mı yavaş olduğu net değildir. "Gerçekçi koşullar altında% 10 daha yavaş" daha anlamlıdır.

Bu soruyu çevrimiçi olarak araştırmak için harcayacağınız zamanı, soruyu yanıtlayan bir cihaz oluşturmak için harcayın. Bu şekilde çok daha doğru sonuçlar alacaksınız. Çevrimiçi okuduğunuz herhangi bir şey, ne olabileceğine dair yalnızca bir tahmindir . Başkalarının programınızın nasıl davranacağına ilişkin tahminlerinden değil, kendi topladığınız gerçeklerden kaynaklanan neden.


2
Sanırım performansı önemseyebilirsin ama yine de "hata ayıklama" kullanma isteğin var. Örneğin, zamanınızın çoğu bağımlılıkları bekliyorsa, hata ayıklama modunda derlemenin büyük bir fark yaratacağını düşünmüyorum, ancak yığın izlerinde satır numaralarını elde etmenin ek faydasına sahipsiniz, bu da hataları daha hızlı düzeltmeye ve daha mutlu kullanıcılar. Önemli olan, artıları ve eksileri tartmanız gerektiğidir ve genel bir "hata ayıklamada çalışmak daha yavaştır, ancak yalnızca CPU'ya bağlıysanız" ifadesi karara yardımcı olmak için yeterlidir.
Josh Mouch

11

Performans hakkında yorum yapamam, ancak "hata ayıklamayı üretime dağıtmayın" tavsiyesi hala geçerli çünkü hata ayıklama kodu genellikle büyük ürünlerde pek çok şeyi farklı şekilde yapıyor. Birincisi, aktif hata ayıklama anahtarlarınız olabilir ve bir diğeri için muhtemelen üretim koduna ait olmayan fazladan mantıklı kontroller ve hata ayıklama çıktıları olacaktır.


Bu konuda sizinle aynı fikirdeyim, ancak bu ana sorunun cevabı değil
sagie

5
@sagie: evet, bunun farkındayım ama konunun hala yapmaya değer olduğunu düşündüm.
Konrad Rudolph

6

Gönderen msdn Sosyal medyadaki

İyi belgelenmemiş, işte bildiğim şey. Derleyici, System.Diagnostics.DebuggableAttribute. Hata ayıklama sürümünde, IsJitOptimizerEnabled özelliği True, yayın sürümünde ise False. Bu özniteliği ildasm.exe ile derleme bildiriminde görebilirsiniz.

JIT derleyicisi, hata ayıklamayı zorlaştıracak optimizasyonları devre dışı bırakmak için bu özniteliği kullanır. Döngüsel değişmez kaldırma gibi kodu hareket ettirenler. Belirli durumlarda bu, performansta büyük bir fark yaratabilir. Genelde değil.

Kesme noktalarını yürütme adresleriyle eşlemek, hata ayıklayıcının işidir. Adres eşlemesini kodlamak için IL talimatını sağlayan JIT derleyicisi tarafından üretilen .pdb dosyasını ve bilgileri kullanır. Kendi hata ayıklayıcınızı yazacaksanız, ICorDebugCode :: GetILToNativeMapping () kullanırsınız.

Temel olarak hata ayıklama dağıtımı, JIT derleyici optimizasyonları devre dışı bırakıldığı için daha yavaş olacaktır.


3

Okuduklarınız oldukça geçerli. Hata ayıklama kodu (#IF DEBUG veya [Koşullu ("DEBUG")]) içermeyen JIT optimizasyonu nedeniyle yayın genellikle daha zayıftır, minimum hata ayıklama sembolü yüklemesi ve genellikle dikkate alınmaması, yükleme süresini azaltacak daha küçük derlemedir. Daha kapsamlı PDB ve yüklenen semboller nedeniyle VS'de kod çalıştırıldığında performans farklılığı daha belirgindir, ancak bağımsız olarak çalıştırırsanız, performans farklılıkları daha az belirgin olabilir. Belirli kodlar diğerlerinden daha iyi optimize edecek ve diğer dillerde olduğu gibi aynı optimizasyon sezgisellerini kullanıyor.

Scott'ın burada satır içi yöntem optimizasyonu hakkında iyi bir açıklaması var

Hata ayıklama ve yayınlama ayarı için ASP.NET ortamında neden farklı olduğuna dair kısa bir açıklama veren bu makaleye bakın .


3

Performans ve hata ayıklayıcının eklenip eklenmediğine ilişkin not etmeniz gereken bir şey, bizi şaşırtmış bir şey.

Hata ayıklaması sonsuza kadar sürecek gibi görünen, ancak kendi başına oldukça iyi çalışan birçok sıkı döngü içeren bir kod parçamız vardı. Başka bir deyişle, sorun yaşayan müşteri veya müşteri yok, ancak hata ayıklarken pekmez gibi çalışıyor gibiydi.

Suçlu, Debug.WriteLinebir süre önce bir hata ayıklama oturumundan kalan, binlerce günlük mesajı tüküren sıkı döngülerin birinde biriydi. Görünüşe göre hata ayıklayıcı eklendiğinde ve bu tür çıktıları dinlediğinde, programı yavaşlatan ek yükler vardır. Bu özel kod için, kendi başına 0,2-0,3 saniye çalışma zamanı ve hata ayıklayıcı eklendiğinde 30+ saniyeydi.

Basit bir çözüm olsa da, artık ihtiyaç duyulmayan hata ayıklama mesajlarını kaldırın.


2

In msdn sitesinde ...

Sürüm ve Hata Ayıklama yapılandırmaları

Hala projeniz üzerinde çalışırken, uygulamanızı genellikle hata ayıklama yapılandırmasını kullanarak oluşturursunuz çünkü bu yapılandırma, hata ayıklayıcıda değişkenlerin değerini ve kontrol yürütmesini görüntülemenizi sağlar. Ayrıca, yalnızca bir yapı türünde veya diğerinde tezahür eden hatalar oluşturmadığınızdan emin olmak için sürüm yapılandırmasında derlemeler oluşturabilir ve test edebilirsiniz. .NET Framework programlamasında bu tür hatalar çok nadirdir, ancak ortaya çıkabilir.

Uygulamanızı son kullanıcılara dağıtmaya hazır olduğunuzda, çok daha küçük olacak ve genellikle ilgili hata ayıklama yapılandırmasından çok daha iyi performansa sahip olacak bir sürüm derlemesi oluşturun. Yapı yapılandırmasını Proje Tasarımcısı'nın Oluştur bölmesinde veya Oluştur araç çubuğunda ayarlayabilirsiniz. Daha fazla bilgi için bkz. Yapılandırma Oluşturma.


1

Bu, büyük ölçüde uygulamanızın hesaplamaya bağlı olup olmadığına bağlıdır ve Lasse'nin örneğinde olduğu gibi bunu söylemek her zaman kolay değildir. Ne yaptığı hakkında en ufak bir sorum varsa, birkaç kez duraklatıp yığını inceliyorum. Gerçekten ihtiyacım olmayan fazladan bir şey varsa, bu hemen fark eder.


1

Yakın zamanda bir performans sorunuyla karşılaştım. Ürünlerin tam listesi 80 saniye gibi çok fazla zaman alıyordu. DB'yi ayarladım, sorguları geliştirdim ve hiçbir fark yoktu. Bir TestProject oluşturmaya karar verdim ve aynı işlemin 4 saniyede yürütüldüğünü öğrendim. Ardından projenin Debug modunda olduğunu ve test projesinin Release modunda olduğunu fark ettim. Ana projeyi Yayın moduna geçirdim ve ürünlerin tam listesinin tüm sonuçları görüntülemesi yalnızca 4 saniye sürdü.

Özet: Hata ayıklama modu, hata ayıklama bilgilerini tuttuğu için çalıştırma modundan çok daha yavaştır. Her zaman Relase modunda konuşlandırmalısınız. .PDB dosyaları eklerseniz, hata ayıklama bilgilerine hala sahip olabilirsiniz. Bu şekilde, örneğin, satır numaralarıyla hataları günlüğe kaydedebilirsiniz.


"Çalıştırma modu" derken "Serbest Bırak" mı?
Ron Klein

Evet kesinlikle. Sürüm, tüm hata ayıklama ek yüküne sahip değildir.
Francisco Goldenstein

1

Hata ayıklama ve Yayın modlarının farklılıkları vardır. Bir araç var Fuzzlyn : Roslyn'i rastgele C # programları oluşturmak için kullanan bir fuzzer'dır. Bu programları .NET çekirdeğinde çalıştırır ve hata ayıklama ve yayınlama modunda derlendiklerinde aynı sonuçları vermelerini sağlar.

Bu araçla birçok hata bulundu ve rapor edildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.