静态链接与动态链接

2023-12-09

在某些情况下,是否有任何令人信服的性能原因来选择静态链接而不是动态链接,反之亦然?我听过或读过以下内容,但我对这个主题的了解还不够,无法保证其真实性。

1) 静态链接和动态链接之间的运行时性能差异通常可以忽略不计。

2) 如果使用使用配置文件数据来优化程序热路径的分析编译器,则 (1) 不成立,因为通过静态链接,编译器可以优化您的代码和库代码。通过动态链接,只能优化您的代码。如果大部分时间都花在运行库代码上,这可能会产生很大的影响。否则,(1) 仍然适用。


  • Dynamic链接可以减少总资源消耗(如果多个进程共享同一个库(当然包括“相同”中的版本))。我相信这是推动它在大多数环境中存在的论点。这里的“资源”包括磁盘空间、RAM 和缓存空间。当然,如果您的动态链接器不够灵活,则存在以下风险:DLL hell.
  • Dynamic链接意味着错误修复和库升级传播改善your产品,无需您运送任何东西。
  • Plugins总是呼吁dynamic链接。
  • Static链接,意味着您可以知道代码将在非常有限的环境(在启动过程的早期,或在救援模式下)。
  • Static链接可以生成二进制文件更容易分发到不同的用户环境(以发送更大且更需要资源的程序为代价)。
  • Static链接可能会稍微允许更快的启动次,但这在某种程度上取决于程序的大小和复杂性and关于操作系统加载策略的详细信息。

进行了一些编辑,以在评论和其他答案中包含非常相关的建议。我想指出的是,您打破这一点的方式很大程度上取决于您计划运行的环境。最小的嵌入式系统可能没有足够的资源来支持动态链接。稍大的小型系统可能很好地支持动态链接,因为它们的内存足够小,使得动态链接节省的 RAM 非常有吸引力。成熟的消费类个人电脑已经,标记笔记,巨大的资源,你可能可以让便利性问题驱动你对这个问题的思考。


为了解决性能和效率问题:这取决于.

传统上,动态库需要某种粘合层,这通常意味着双重分派或函数寻址中的额外间接层,并且可能会花费一点速度(但函数调用时间实际上是运行时间的很大一部分吗???)。

但是,如果您运行的多个进程都多次调用同一个库,那么相对于使用静态链接,使用动态链接时最终可能会节省缓存行(从而赢得运行性能)。 (除非现代操作系统足够聪明,能够注意到静态链接的二进制文件中的相同段。似乎很难,有人知道吗?)

另一个问题:加载时间。您在某个时候支付装载费用。您何时支付此费用取决于操作系统的工作方式以及您使用的链接。也许您宁愿推迟付款,直到您知道需要它为止。

请注意,静态链接与动态链接传统上是not一个优化问题,因为它们都涉及到目标文件的单独编译。然而,这不是必需的:原则上,编译器可以最初将“静态库”“编译”为摘要的 AST 形式,然后通过将这些 AST 添加到为主代码生成的 AST 来“链接”它们,从而实现全局优化。我使用的系统都没有这样做,所以我无法评论它的工作效果。

回答性能问题的方法是always通过测试(并使用尽可能类似于部署环境的测试环境)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态链接与动态链接 的相关文章

随机推荐