2014-11-04 56 views
0

我有一個代碼庫類似於以下:構建系統的性能影響到未使用的庫

來源:

src/a/b/c.cpp 

和單元測試(這些實際上是升壓單元測試可執行文件):

test/a/b/c_test.cpp 

src樹用於單個可執行目標。然而,c.cpp僅使用該目標的庫依賴關係的子集,例如-lx-lx -ly -lz

同樣,c_test.cpp編譯爲一個測試可執行文件,鏈接到c.cpp的-lx,c.o和一些更多的附加庫供測試。

有關設置構建系統,在這種情況下,我有兩個選擇:

  1. 對每個這樣的可執行文件在構建系統有自己的圖書館依賴列表。 (痛苦的,但也許可以通過映射頭依賴 - >庫自動化。)
  2. 或者,只是使用相同的庫列表爲所有測試可執行文件和主要可執行文件。 (簡單,無痛的方式)。

什麼是構建系統的性能影響的#2「在大」?真的有關係嗎?

其他: 這是G ++(Debian的4.9.1-16)4.9.1

回答

1

這個問題的答案真的取決於這些庫,但在一般情況下,我會說「大概沒有大影響,除非圖書館是巨大的「。這是問題的實際使用的庫,特別是如果它們很大,因爲庫中的所有代碼都必須被複制。

我剛做了一個小實驗,並編譯了一個「Hello World」程序(使用clang++,但它在後端使用相同的鏈接器,無論您使用的是clang++還是g++,默認庫都是按照編譯器提供的。最好的時間是0.232s(第一次,因爲必須讀取編譯器從盤花了約2秒)

我接着又說了llvm-config --libs(所以你需要的庫當您使用LLVM編譯器架構),這會變成這樣:

-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter 
-lLLVMIRReader -lLLVMAsmParser -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption 
-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG 
-lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info 
-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMRuntimeDyld -lLLVMLineEditor 
-lLLVMInstrumentation -lLLVMInterpreter -lLLVMExecutionEngine -lLLVMCodeGen 
-lLLVMScalarOpts -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMBitReader 
-lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget 
-lLLVMMC -lLLVMCore -lLLVMSupport 

這樣,鏈接時,使我的編譯器項目成爲一個好的100MB的可執行文件。

與「hello world」程序的編譯時間差異大約爲0.04s。

所以,我會保持簡單並保持一個庫的單一列表。

但我會補充說,它取決於文件的位置。如果您要在非常慢的文件服務器上鍊接一堆文件,則可能需要更長的時間才能閱讀「該庫包含的內容」。