构建gcc链接到未使用库的系统性能影响

时间:2014-11-04 23:42:14

标签: c++ performance gcc ld build-system

我有一个类似于以下代码库:

来源:

src/a/b/c.cpp

和单元测试(这些实际上是单元测试可执行程序):

test/a/b/c_test.cpp

src树用于单个可执行目标。但是c.cpp仅使用该目标的库依赖关系的子集,例如-lx-lx -ly -lz

同样地,c_test.cpp编译为链接到c.cpp' -lxc.o的测试可执行文件以及一些用于测试的其他库。

为了设置构建系统,在这种情况下,我有两个选项:

  1. 将构建系统中的每个此类可执行文件与其自己的库依赖项列表配对。 (痛苦,但也许可以通过映射标头依赖关系来自动化 - >库。)
  2. 或者,只需对所有测试可执行文件和主可执行文件使用相同的库列表。 (简单,无痛的方式)。
  3. #2"在大型"中的构建系统性能影响是什么?这真的很重要吗?

    其他: 这是用g ++(Debian 4.9.1-16)4.9.1

1 个答案:

答案 0 :(得分: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.04秒。

所以,我会保持简单并维护一个库列表。

但我会补充说,它确实取决于文件的位置。如果你在非常慢的文件服务器上链接一堆文件,可能需要更长的时间来阅读"这个库包含什么"。