假设我有一个库 - foo.so。在构建我的二进制文件(需要这个库)时,我可以(1)链接foo.so,或者,(2)在程序源代码中,dlopen这个库,然后调用这个库提供的函数
当我从库中调用函数时,(1)和(2)之间是否有任何性能差异?请注意,我知道会有不同的初始化特性(例如dlopen的成本,首次使用符号的开销等),但在稳定状态下,两种选择是否同样快或者更快?
感谢。
答案 0 :(得分:3)
如果库是使用lib*.so
编译并与gcc -Wall -fPIC -O2
链接的共享对象(即某些gcc -shared
文件),那么它是ELF Position Independent Code共享的库。
PIC在32位x86上的成本更高 - 它的寄存器很少 - 而不是64位x86-64 - 它有一些寻址方式有助于PIC
如果它是dlopen
- 或者它是动态链接的,那么它在性能方面是相同的(在稳定状态下)。因为在这两种情况下,真正的链接都是由dynamic linker完成的(例如ld-linux.so
)正弦libdl.so
基本上是动态链接器的包装器。
调用时性能最重要的是lib*.so
中的代码,如果你dlopen
或链接它,它就不会改变。
如果库静态链接lib*.a
,情况可能略有不同。您甚至可以使用最近GCC编译器的link time optimization能力编译和链接库和程序(编译和链接与gcc -flto -Wall -O2
)< / p>
阅读Drepper的How to Write Shared Library论文以及Program Library HowTo和Levine's Linkers & Loaders一书。