2012-05-18 49 views
5

'dan çok daha yavaş bir şekilde derleniyor Visual Studio 2005'in altında, sürüm oluşturmak için yaklaşık 2 dakika, ancak hata ayıklamak için yaklaşık 6 dakika süren tek bir kitaplık w/195 cpp dosyası var.Hata ayıklama, sürüm

Her zaman sürüm oluşturmalarının optimizasyon nedeniyle daha uzun sürmesi gerektiğini düşündüm. Bir hata ayıklama yapısı neden sürümden daha uzun sürüyor? Hata ayıklama sürümümüzü sürüm kadar hızlı bir şekilde hızlandırmak için var mı?

Yeterli miktarda destek/stl kodumuz var.

+1

Her ikisinde de önceden derlenmiş üstbilgileri mi kullanıyorsunuz? –

+0

Yapı seçenekleri nelerdir? –

+1

Evet PCH her ikisinde de./I/D PCH haricindeki yapı seçenekleri:/Od/Gm/EHsc/RTC1/MDd/W4/nologo/c/Wp64/ZI/TP/errorReport: komut istemi/wd4018/Zm200. Evet, orada "büyük bir opsiyonel dosya yazalım" diye merak ediyordum. Times kütüphaneyi kurmak için sadece bağlantı kurmayacak. – Philip

cevap

0

Starbolin'in yorumunu cevabına koyacağım: elma ve portakallar. I/O sınırlı charley sanırım hata ayıklama için yazılı 600MB ve sürüm için 300MB benim Süreç Monitör hesaplama ile pan gözükmüyordu. Yani, fazladan 300MB yazmak, 4 dakika değil, birkaç saniye sürecektir.Bu nedenle, Debug ve Release sürümleri arasında yalnızca bir grup şeyin farklı olabileceği sonucuna varıyorum. Optimizasyonun optimizasyondan daha uzun sürmesi gerekmesine rağmen, bu diğer hata ayıklama etkinlikleri yalnızca bundan daha fazla zaman almalıdır. Debug ve Release için zamanın tam olarak nereye gittiğini görmek güzel olurdu, ama oldukça farklı süreçler olduklarını açıkça görüyoruz ve Debug sadece Visual Studio 2005 ve kıyaslama yaptığım proje için çok daha uzun sürüyor.

7

En iyi tahmin: Hata ayıklama yapıları G/Ç sınırlı iken, Sürüm oluşturma işlemleri işlemci sınırlı (bu durumda).

Yapım sistemimizde kapsamlı bir kıyaslama gerçekleştirdik - çok sayıda büyük proje, biraz küçük. DEBUG, çok fazla *.pdb bilgi, çok daha büyük *.obj dosyaları (fazladan hata ayıklama bilgisi için), vb. Oluşturur. Sonuç, büyük ölçüde daha fazla disk etkinliğidir. Bu vs. Aksine

, RELEASEçok küçük *.obj dosyaları yazma ve gelmez oluşturur daha da size kaynak kodu (tablolar, semboller, dize hazır bilgi) içinde "değişmez" bir sürü varsa vurgulanır "Hata ayıklama" veritabanlarını yazmaktan çekinmeyin (RELEASE'u tipik anahtarlarla derlerseniz). Ancak, RELEASE'daki linker, optimizasyonlarını ve DEBUG'da henüz yapılmayan diğer önemli işleri yapmak zorundadır, bu yüzden işlemci bağlıdır. Bu, en zorlayıcı-linker anahtarlarıyla "hız-maksimize-hız/boyut" derlerseniz RELEASE için daha fazla zaman cezalandırılır.

(Ancak, evet, RELEASE inşa gerekir çalıştırılabilir refah-on-disk yerleşik, ancak yürütülebilir RELEASE yapı içinde çok küçük olduğundan, size sayfa çok hala I/O güncellemesi-adresler az, bu yüzden RELEASE yapı içinde G/Ç ceza kadar DEBUG yapı için olduğu gibi değildir.) bir 3 kez "RELEASEDEBUG daha pahalıdır" gözlemliyoruz

. Pek çok şablon, birçok sembol ve literal, vb. Ile I/O-bağlı olan bazı projeler için bu doğrudur. Sürücülerinizi kontrol edin - dolu olsun, ya da sadece "yavaş sürücüler" ve/veya bazı kötü sektörlerle ? Bu DEBUG için daha kötü (daha yavaş) yapacaktır.

Evet, diğer yapılar "RELEASE 0x'dan 3 kat daha pahalı gibi bir şey" ile diğer yollardan olmalıdır. Bu yapılar, I/O-bağlı yerine işlemci/bağlayıcı-bağlıdır.

[UPDATE], bunun "statik kütüphane, bağlantı yok" sorusu hakkındaki yorumda görüyorum. Bu, I/O için bir zaman cezası (bir sürü disk faaliyeti, bağlantı yok) ve bir işlemci cezası olmaksızın (herhangi bir optimizasyon yapılmadığından) en kötü durum senaryosudur. Yani, bir 3x "DEBUG -is-slower-RELEASE" var ise, bu muhtemelen alabileceği kadar kötü (bu proje için), ve bu atipik değil. Bağlantı seçeneklerini eklediğinizde, RELEASE yavaşlar.

+2

Dosya sistemi önbellek tembel geri yazma özelliği sayesinde dosyaları Windows'ta gerçekten ucuzdur. Bu cevap sadece makine ağır bir şekilde RAM kısıtlıysa anlamlıdır. Olabilir, ancak bir gigabyte değerinde nesne/hata ayıklama verisi üretmek o kadar kolay değildir. –

+0

@Hans, bir anlaşmayla. Lazy-writes yardım ediyor, ancak NTFS'nin diğer dosya sistemlerine kıyasla neredeyse tüm dosya işlemleri için inanılmaz derecede pahalı olduğunu gördük. Dosyalar ağ kaynaklarından önbelleğe alınırsa/aktarılırsa, elbette, tembel yazılar hiç yardımcı olmayacaktır (örneğin, çiftlikler inşa et, dağıtık yapı sistemleri). Win7, XP/Vista (Win7 güvenlik geliştirmeleri nedeniyle) üzerinde daha fazla dosya tanıtımı ceza/gecikme garipliği ekledi ve gömülü sistemlerimizle her türlü dosya/bağlantı noktası sorunlarına neden oldu. – charley

+1

[Bu blog yazısı] (http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you -build.aspx), hata ayıklamada ve serbest bırakmada yazılmış baytların nasıl ölçüleceğini açıklar. Devenv.exe ve cl.exe'yi izlemeniz gerektiğini unutmayın. Sürüm için yaklaşık 300MB ve hata ayıklama için yazılmış 600MB çıktı. Sadece 1GB'lık bir materyalin kopyalanmasında test ettim ve bu yaklaşık 10 saniye sürdü. Bu yüzden bana fazladan 300MB'de yazmanın gerçekten 4 dakika daha uzun sürebileceğini bana söylemiyor. Sadece IO'nun yanında uzun zaman alan başka derleyici aktivitesi olmalı. – Philip