【问题标题】:build system performance impact of gcc linking to unused librariesgcc 链接到未使用的库的构建系统性能影响
【发布时间】:2014-11-04 23:42:14
【问题描述】:

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

来源:

src/a/b/c.cpp

和单元测试(这些实际上是 boost 单元测试可执行文件):

test/a/b/c_test.cpp

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

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

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

  1. 将构建系统中的每个此类可执行文件与其自己的库依赖项列表配对。 (很痛苦,但也许可以通过映射头依赖 -> 库来自动化。)
  2. 或者,对所有测试可执行文件和主可执行文件使用相同的库列表。 (简单、无痛的方法)。

#2“大体上”的构建系统性能影响是什么?真的很重要吗?

杂项: 这是 g++ (Debian 4.9.1-16) 4.9.1

【问题讨论】:

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


    【解决方案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 秒。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多