由于动态链接库必须在运行时解析,静态链接可执行文件比动态链接可执行文件更快吗?静态链接的可执行文件比动态链接的可执行文件更快吗?
回答
它取决于磁盘的状态以及是否可能在其他进程中使用DLL。当你的程序和它的DLL永远不会被加载时,冷启动会发生。没有DLL的EXE有更快的冷启动,因为只需要找到一个文件。你将不得不有一个严重分散的磁盘,几乎已满,没有这种情况。
当一个DLL已经加载到另一个进程中时,DLL可以开始付清。现在DLL的代码页是简单共享的,启动开销为非常低低且内存使用率高效。
一个有点类似的情况是一个热启动,一个启动,其中DLL在上次使用时仍在文件系统缓存中可用。寒冷和热烈的开始之间的区别在一个呆滞的磁盘上可能非常重要。大家都喜欢SSD的原因之一。
静态链接产生比动态链接更大的可执行文件,因为它必须将所有库代码直接编译到可执行文件中。好处是减少了从库中调用函数的开销,以及从稍微到明显更快的加载时间的任何地方。
动态链接的可执行文件将更小,因为它将运行时调用到共享代码库。这有几个好处,但从速度或优化角度来看,重要的是减少磁盘空间和内存消耗量,并改善多任务处理,因为减少了资源消耗(尤其是在Windows中)。
所以这是一个折衷:有理由要么为什么要么一个可能稍微快一点。这取决于许多不同的事情,比如程序中速度至关重要的例程依赖于对库函数的调用。但是在上述声明中要强调的重要一点是,它可能会更快地。 速度差异将近难以察觉,甚至与正常的预期波动难以区分。
如果你真的关心,基准它,看看。但我建议这是浪费时间,并且提高应用程序速度有更有效和更重要的方法。考虑到“动态链接或静态链接”决策时的速度以外的其他因素,您的状况会更好。例如,如果您需要使您的应用程序更易于部署,尤其是不同的用户环境,则静态链接可能值得考虑。或者,动态链接可能是一个更好的选择(尤其是如果这些共享库不是您自己的),因为您的应用程序将自动获得对其调用的任何共享库进行升级的好处,而无需松开手指。
编辑:微软让你prefer dynamic linking over static linking的具体建议:
不建议重新分配 C/C++应用程序,静态 链接到Visual C++库。它是 经常错误地认为通过将您的程序静态链接到 Visual C++库,有可能通过 显着提高应用程序的性能 。然而,在几乎所有情况下,对动态加载 Visual C++库的影响 几乎没有影响 。此外, 静态链接不允许 通过 应用程序的作者或Microsoft为应用程序及其 相关库提供服务。对于 示例,请考虑一个应用程序,该应用程序可以静态链接到特定的 库,并在该库的新版本的客户端计算机 上运行。 该应用仍然使用 的代码,该库的以前版本 不受益于库 的改进,例如安全性 增强功能。 C/C++ 的作者强烈建议 通过服务场景 进行思考,然后再决定静态链接到 相关库,并尽可能使用动态链接 。
- 1. 可疑的静态链接可执行文件大小
- 2. 可以将.so文件静态链接到可执行文件吗?
- 3. 编译“压力ng”包的静态链接可执行文件
- 4. 从可执行文件中提取静态链接的库
- 5. CMake Visual Studio链接可执行文件与静态库
- 6. GDB可以使用静态链接库重新加载可执行文件吗?
- 7. UNIX:将可执行文件链接到静态库和动态库?
- 8. 在可执行文件中找不到C++动态链接库
- 9. 如何将动态可执行文件转换为静态可执行文件?
- 10. C++可执行文件链接问题
- 11. 链接一个可执行文件
- 12. Cmake只链接到可执行文件
- 13. 链接到静态库来构建静态可执行
- 14. linux gcc链接的可执行文件缺少stat64的静态定义
- 15. 直接调用动态链接器时确定真正的可执行文件
- 16. 链接可执行文件中缺少静态库中的符号
- 17. 如何将外部库静态链接到我的可执行文件中?
- 18. 扭矩BLCR检查点与静态链接的可执行文件
- 19. 静态链接断开Windows上的调试可执行文件(mingw)
- 20. Android链接.so用于命令行可执行文件吗?
- 21. 加载链,静态库和可执行文件
- 22. 可执行文件在构建后是否可以链接到动态库?
- 23. 如何创建一个静态链接golang可执行文件1.5+
- 24. VS2015如何将静态库链接到其他库和可执行文件?
- 25. 如何在Racket中创建动态链接的可执行文件?
- 26. 可执行文件找不到动态链接的mkl库,但ldd确实有
- 27. 为什么静态链接的可执行文件中有全局偏移表和过程链接表?
- 28. 在链接可执行文件时只指定一个静态库的链接标记
- 29. 链接器错误编译使用Boost.Thread使用Boost.Thread链接到静态库的可执行文件
- 30. 在静态/动态链接的情况下,lib依赖如何写入ELF可执行文件的.dynamic部分?
通常,当您在库中动态链接时,通话会有一些开销。一个调用通过一个中间表,并且由于库自身映射为只读,所以它的所有变量也必须驻留在库之外。但我不知道Windows的详细信息。通常开销可以忽略不计,选择动态链接要好得多。用于代码重用和能够使用安全漏洞升级库。 – 2011-01-12 11:19:34