2011-02-17 19 views
11

Boost Program Options kullanıyorum ve çok küçük bir C++ kodu derlemek için oldukça uzun bir süre gerekiyor (10 saniye veya daha fazla). Destek kütüphanesi olmadan kodun 1 saniye sürmesi gerekiyordu.Yükseltme kitaplıkları kullanırken derleme/bağlantı süresini hızlandırın

Derleme kütüphanesi ile derleme/bağlantı süresinin nasıl artırılacağı hakkında bir fikriniz var mı? Çapraz platform, bu yüzden kodu Mac OS X/Linux/PC ile derlemem gerekiyor.

+1

Bazı destek parçaları çok kullanışlıdır. Pek çok bileşen bana karşı üstyapıya bakmış ve sadece başlıklarda uygulandıkları için korkunç başlık bağımlılıkları elde etmişler. Böylece, arızalı kodun gereksiz yere tekrar tekrar derlenmesini sağlarsınız, oysa statik veya paylaşılan bir kütüphane iyi bir şekilde çalışır. –

+1

Boost'u derlemek için yeterince modern olan hemen hemen her derleyici, önceden derlenmiş üstbilgileri de destekler. Bunlar kavramsal olarak sadece başlık kütüphaneleri için statik kütüphanelerin eşdeğeridir. – MSalters

+0

http://www.boost.org/boost-build2/doc/html/bbv2/reference/precompiled_headers.html – Dilawar

cevap

15

her zamanki hileler dışında yapabilecekleri gerçekten fazla bir şey yok: gerçekten gereken sadece Boost başlıklarında çekin ve birçok kütüphaneler tek olması (mümkün olduğunca spesifik başlıklarını kullanın:

  • bağımlılıkları en aza indirmek "ana" başlığı, örneğin boost/thread.hpp değil, aynı zamanda boost/thread/shared_mutex.hpp gibi belirli başlıkları ile bir alt) yerine, tüm başlık dahil olmak üzere ön beyanları güvenmek mümkün
  • ,
  • mümkünse yalnızca başlık bulunması .cpp dosya. Bir başlık içine eklerseniz, bu başlık içeren bir çeviri birimi her derlendiğinde derlenmesi gerekir. Genel bir kural olarak, başlıklardaki kod miktarını en aza indirmeye çalışın, tüm büyük derleyiciler önceden derlenmiş üstbilgileri destekler. Derleme süresini unity builds ile
  • deneyini kesmek için kullanın. Bu sizin durumunuzda bir avantaj olabilir veya olmayabilir.

Ve son olarak, ancak sonuncu seçenek, yalnızca bu özel Destek kitaplıklarını kullanmamaktır.

Bazen bazı Boost lib'lerini kullanmadan önce, kullanımdan kaldırıyorum ve derleme zamanı çok kötü olduğunda, hangi kütüphanelerin derlenmesi ve hangisinin nispeten basit bir kodla değiştirilebileceğine bakmaya başladım. Çoğu zaman, Boost genel olması gereği tarafından engellenir. 8 yaşındaki derleyiciler üzerinde çalışan ya da çok farklı türlerde çalışmak zorunda olmayan bir şeye ihtiyacınız yoksa, o zaman sizin için işe yarayan basit bir yazı yazabilir ve neredeyse hiç zaman kaybetmezsiniz. derlemek

+0

derleme zamanının neredeyse her zaman çok iyi bir şekilde yeniden desteklenmekten daha değerli olduğunu mu söylüyorsunuz? İyi CPU ve SSD disk satın alma konusunda ne düşünüyorsunuz? Ayrıca, önceden derlenmiş üstbilgileri kullanma yönergeleriniz bu sorunu ortalama% ~ 80 oranında azaltır. Neredeyse listelediğiniz sonuncusu olduğunu düşünüyorum çünkü gerçekten tüm derleyiciler tarafından desteklenmiyor, sadece tüm popülerler tarafından. 'Boost Program Options', genellikle programınız sadece" arg1 arg2 "den daha karmaşık girdi gerektiriyorsa kullanılır. Bu durumda onu yeniden ele almak gerçekten zaman alıcı bir seçenek olurdu. –

+0

@Andy: Hayır, * bazı * durumlarda göz önünde bulundurabileceğiniz bir * seçenek olduğunu söyledim. – jalf

1

Derleme sürelerini azaltmak için compiler firewall idiom ile iyi bir başarı elde ettim.

+1

AKA Pimpl idiom. Uygulama, garip/olağandışı/masraflı bağımlılıklara sahip olduğunda (sınıfın API'sine ihtiyaç duymadığınız/istemediğiniz üçüncü parti kütüphaneler gibi) Pimpl gerçekten iyidir.Ancak, Pimpl örneğinin bir başka (genellikle dinamik olarak tahsis edilmiş) sınıf örneğinde olduğu gibi, kodun karmaşıklığının yanı sıra, sınıfın çoğu API'sinin bir şekilde Pimpl sınıfına iletileceğinden maliyetlere katlanacağını unutmayın. – Meros