包含库的运行时性能成本是多少?

Mat*_*ath 3 c c++ performance include

包含整个库(可能有数百个函数)然后只使用单个函数之间是否有任何运行时性能差异:

#include<foo>

int main(int argc, char *argv[]) {
    bar();//from library foo
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在将相关代码片段从库直接粘贴到代码之间,例如:

void bar() {
...
}

int main(int argc, char *argv[]) {
    bar();//defined just above
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是什么阻止我在我的C文件开头无意识地包括我最喜欢的(也是最常用的)库?这个流行的线程C/C++:检测多余的#includes?表明编译时间会增加.但编译后的二进制文件会有什么不同吗?第二个项目是否真的胜过第一个项目?


相关:#include <stdio.h>在ac程序中真的做了什么

编辑:这里的问题与相关的不同请问在C/C++中包含未使用的头文件是否有性能损失?这里的问题是包含一个文件.我在这里问,如果包含单个文件与将实际使用的代码片段复制粘贴到源中有任何不同.我稍微调整了标题以反映这种差异.

Lun*_*din 11

就最终计划而言,没有性能差异.链接器仅链接实际用于程序的函数.库中存在的未使用的函数将无法链接.

如果包含许多库,则编译程序可能需要更长的时间.

您不应该包括所有"最喜欢的库"的主要原因是程序设计.您的文件不应包含除正在使用的资源之外的任何内容,以减少文件之间的依赖关系.你的文件对程序其余部分的了解越少越好.它应尽可能自主.


sil*_*asp 6

这不是一个简单的问题,所以不值得一个简单的答案.在确定哪些性能更​​高时,您可能需要考虑许多事项.

  1. 您的编译器和链接器:不同的编译器将以不同的方式进行优化.这是容易被忽视的事情,并且在进行概括时可能会导致一些问题.在大多数情况下,现代编译器和链接器将优化二进制文件,仅包含执行所需的100%.但是并非所有编译器都会优化二进制文件.
  2. 动态链接:使用其他库时有两种类型的链接.他们的行为方式类似,但根本不同.当您链接到动态库时,库将与程序保持独立,并且仅在运行时执行.动态库通常称为共享库,因此应被视为多个二进制文件使用它们.由于这些库通常是共享的,因此链接器不会从库中删除任何功能,因为链接器不知道该系统或操作系统中所有二进制文件将需要该库的哪些部分.因此,与动态库链接的二进制文件将会有很小的性能损失,尤其是在启动程序之后.随着动态链接的数量,这种性能上升将会增加.
  3. 静态链接:当您将二进制文件与静态库(使用优化链接器)链接时,链接器将"知道"您将从该特定库中获取哪些功能,并将删除不会在生成的二进制文件中使用的功能.因此,二进制文件将变得更有效,因此性能更高.然而,这需要付出代价.

    例如

    假设您有一个操作系统,它在整个系统中的大量二进制文件中广泛使用库.如果您要将该库构建为共享库,则所有二进制文件将共享该库,同时可能使用不同的功能.现在假设您将每个二进制文件静态链接到库.您最终会得到大量重复的二进制功能,因为每个二进制文件都需要从该库中获得所需功能的副本.

结论:值得注意的是,在提出问题之前,什么会使我的程序更高效,你应该问自己在你的情况下哪些更高效.您的程序是否占用了大部分CPU时间,可能需要使用静态链接库.如果您的程序只是偶尔运行,可能需要动态链接库来减少磁盘使用量.值得注意的是,使用基于头的库只会给静态链接二进制文件带来非常小的(如果有的话)性能提升,并且会大大增加编译时间.