由于动态链接库必须在运行时解析,静态链接的可执行文件比动态链接的可执行文件更快吗?
由于动态链接库必须在运行时解析,静态链接的可执行文件比动态链接的可执行文件更快吗?
不建议重新分发静态链接到 Visual C++ 库的 C/C++ 应用程序。经常错误地认为通过将程序静态链接到 Visual C++ 库,可以动态加载Visual C++库可以显著提高应用程序的性能。然而,在几乎所有情况下,动态加载对性能的影响是微不足道的。此外,静态链接不允许应用程序作者或Microsoft通过服务方式来维护应用程序及其依赖库。例如,考虑一个静态链接到特定库的应用程序,在客户端计算机上运行,该计算机上有该库的新版本。该应用程序仍使用先前版本库中的代码,并且不能从库的改进(例如安全增强)中受益。强烈建议C/C++应用程序的作者在决定是否静态链接到依赖库之前,认真考虑服务方案,并尽可能使用动态链接。
这取决于您的磁盘状态以及DLL是否可能在其他进程中使用。当您的程序及其DLL从未被加载过时,会发生冷启动。没有DLL的EXE具有更快的冷启动速度,因为只需要找到一个文件。除非您的磁盘严重碎片化并且几乎满了,否则就不会出现这种情况。
当DLL已经加载到另一个进程中时,它可以开始发挥作用。此时,DLL的代码页仅简单共享,启动开销非常低,并且内存使用效率高。
类似的情况是温启动,即启动时DLL仍然可从先前使用过的文件系统缓存中获得。在磁盘响应较慢时,冷启动和温启动之间的差异可能相当大。这也是每个人都喜欢SSD的原因之一。
不,我不这么认为。在大多数情况下,每个程序在内存中只有库的副本,使整个系统的内存占用更少。假设您有100个使用libc库静态方式的程序,并且libc大小约为2-3MB,那么它会增加程序的大小。 但是在动态方式下,我们可以共享资源,因此内存中的字节数越少,缓存中的字节数就越多,缓存中的字节数越多,速度就越快。 尽管它具有加载开销,但您的整个系统性能更快。