静态链接的可执行文件比动态链接的可执行文件更快吗?

41

由于动态链接库必须在运行时解析,静态链接的可执行文件比动态链接的可执行文件更快吗?


1
通常情况下,当您动态链接库时,会存在一些调用开销。调用经过中介表进行,由于库本身是映射为只读的,因此它的所有变量也必须驻留在库外部。但我不知道Windows的详细情况。通常开销可以忽略不计,选择动态链接要好得多。这样可以实现代码重用和升级具有安全漏洞的库的能力。 - I GIVE CRAP ANSWERS
可能是静态链接与动态链接的重复问题。 - Arnaud
3个回答

33
静态链接会生成比动态链接更大的可执行文件,因为它必须直接将所有库代码编译到可执行文件中。好处是不再需要从库中调用函数,从而减少开销,加载时间可能略有或明显地加快。
动态链接的可执行文件将更小,因为它在运行时向共享代码库发出调用。这有几个好处,但从速度或优化的角度来看,重要的是减少磁盘空间和内存消耗,并且由于降低了 资源消耗(特别是在Windows中),提高了多任务处理能力。
因此这是一种权衡:可以为任何一种情况辩解并认为它可能略微更快。这将取决于许多不同的因素,例如程序中的速度关键例程在多大程度上依赖于对库函数的调用。但是,上述声明的重要点是它可能会 略微 更快。 速度差异将几乎不容易被察觉,甚至难以区分正常预期波动。
如果您真的关心,请进行基准测试。但我建议这是浪费时间,并且有更有效和更重要的提高应用程序速度的方法。从长远来看,在制定“动态链接还是静态链接”的决策时,考虑速度以外的因素会更好。例如,如果需要使应用程序更容易部署到不同的用户环境,则值得考虑静态链接。或者,动态链接可能是更好的选择(特别是如果那些共享库不是您自己的),因为您的应用程序将自动获得调用的任何共享库所做的升级的好处,而无需举手。
编辑:微软推荐您 优先使用动态链接而不是静态链接

不建议重新分发静态链接到 Visual C++ 库的 C/C++ 应用程序。经常错误地认为通过将程序静态链接到 Visual C++ 库,可以动态加载Visual C++库可以显著提高应用程序的性能。然而,在几乎所有情况下,动态加载对性能的影响是微不足道的。此外,静态链接不允许应用程序作者或Microsoft通过服务方式来维护应用程序及其依赖库。例如,考虑一个静态链接到特定库的应用程序,在客户端计算机上运行,该计算机上有该库的新版本。该应用程序仍使用先前版本库中的代码,并且不能从库的改进(例如安全增强)中受益。强烈建议C/C++应用程序的作者在决定是否静态链接到依赖库之前,认真考虑服务方案,并尽可能使用动态链接。


13

这取决于您的磁盘状态以及DLL是否可能在其他进程中使用。当您的程序及其DLL从未被加载过时,会发生冷启动。没有DLL的EXE具有更快的冷启动速度,因为只需要找到一个文件。除非您的磁盘严重碎片化并且几乎满了,否则就不会出现这种情况。

当DLL已经加载到另一个进程中时,它可以开始发挥作用。此时,DLL的代码页仅简单共享,启动开销非常低,并且内存使用效率高。

类似的情况是温启动,即启动时DLL仍然可从先前使用过的文件系统缓存中获得。在磁盘响应较慢时,冷启动和温启动之间的差异可能相当大。这也是每个人都喜欢SSD的原因之一。


点赞。从实际角度来看,这可能更重要。 - weiweishuo

2

不,我不这么认为。在大多数情况下,每个程序在内存中只有库的副本,使整个系统的内存占用更少。假设您有100个使用libc库静态方式的程序,并且libc大小约为2-3MB,那么它会增加程序的大小。 但是在动态方式下,我们可以共享资源,因此内存中的字节数越少,缓存中的字节数就越多,缓存中的字节数越多,速度就越快。 尽管它具有加载开销,但您的整个系统性能更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接