2011-01-12 73 views
11

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

+1

通常,当您在库中动态链接时,通话会有一些开销。一个调用通过一个中间表,并且由于库自身映射为只读,所以它的所有变量也必须驻留在库之外。但我不知道Windows的详细信息。通常开销可以忽略不计,选择动态链接要好得多。用于代码重用和能够使用安全漏洞升级库。 – 2011-01-12 11:19:34

回答

3

它取决于磁盘的状态以及是否可能在其他进程中使用DLL。当你的程序和它的DLL永远不会被加载时,冷启动会发生。没有DLL的EXE有更快的冷启动,因为只需要找到一个文件。你将不得不有一个严重分散的磁盘,几乎已满,没有这种情况。

当一个DLL已经加载到另一个进程中时,DLL可以开始付清。现在DLL的代码页是简单共享的,启动开销为非常低低且内存使用率高效。

一个有点类似的情况是一个热启动,一个启动,其中DLL在上次使用时仍在文件系统缓存中可用。寒冷和热烈的开始之间的区别在一个呆滞的磁盘上可能非常重要。大家都喜欢SSD的原因之一。

9

静态链接产生比动态链接更大的可执行文件,因为它必须将所有库代码直接编译到可执行文件中。好处是减少了从库中调用函数的开销,以及从稍微到明显更快的加载时间的任何地方。

动态链接的可执行文件将更小,因为它将运行时调用到共享代码库。这有几个好处,但从速度或优化角度来看,重要的是减少磁盘空间和内存消耗量,并改善多任务处理,因为减少了资源消耗(尤其是在Windows中)。

所以这是一个折衷:有理由要么为什么要么一个可能稍微快一点。这取决于许多不同的事情,比如程序中速度至关重要的例程依赖于对库函数的调用。但是在上述声明中要强调的重要一点是,它可能会更快地速度差异将近难以察觉,甚至与正常的预期波动难以区分。

如果你真的关心,基准它,看看。但我建议这是浪费时间,并且提高应用程序速度有更有效和更重要的方法。考虑到“动态链接或静态链接”决策时的速度以外的其他因素,您的状况会更好。例如,如果您需要使您的应用程序更易于部署,尤其是不同的用户环境,则静态链接可能值得考虑。或者,动态链接可能是一个更好的选择(尤其是如果这些共享库不是您自己的),因为您的应用程序将自动获得对其调用的任何共享库进行升级的好处,而无需松开手指。


编辑:微软让你prefer dynamic linking over static linking的具体建议:

不建议重新分配 C/C++应用程序,静态 链接到Visual C++库。它是 经常错误地认为通过将您的程序静态链接到 Visual C++库,有可能通过 显着提高应用程序的性能 。然而,在几乎所有情况下,对动态加载 Visual C++库的影响 几乎没有影响 。此外, 静态链接不允许 通过 应用程序的作者或Microsoft为应用程序及其 相关库提供服务。对于 示例,请考虑一个应用程序,该应用程序可以静态链接到特定的 库,并在该库的新版本的客户端计算机 上运行。 该应用仍然使用 的代码,该库的以前版本 不受益于库 的改进,例如安全性 增强功能。 C/C++ 的作者强烈建议 通过服务场景 进行思考,然后再决定静态链接到 相关库,并尽可能使用动态链接 。

相关问题