是否有任何令人信服的业绩原因选择静态链接过动态的连接,反之亦然在某些情况下?我听说过或读取以下,但我不知道够不够的问题,以保证其真实性。

1)差别在运行时能之间的静态和动态联通常可以忽略不计。

2)(1)不是真实的,如果使用一个分析编译器,使用配置文件的数据,以优化程序hotpaths因为静态的连接,编译器可以优化这两个你的代码和图书馆的代码。与动态的连接只有你的代码可以优化。如果大部分时间都花在运行图书馆的代码,这可以作出很大的差异。否则,(1)仍然适用。

有帮助吗?

解决方案

  • 动态 链接可以 减少的资源总消耗量 (如果多于一个处理股同样的图书馆(包括版本,在"相同的",当然)).我认为这是一个参数,推动它存在于大多数环境。在这里,"资源"包括磁盘空间、RAM和缓存空间。当然,如果你的动态的头是不够灵活,是有风险的 DLL地狱.
  • 动态 连接装置,修复和升级,以图书馆 传播 提高 你的 产品,而不需要你的船东西。
  • 插件 总是呼吁 动态 联。
  • 连接,这意味着你就可以知道代码将运行在很 有限的环境中 (在早期启动进程,或者在救援模式)。
  • 链接,可以做二进制文件 更容易分发 不同用户的环境(在发送成本的更大和更多的资源饥饿的程序)。
  • 链接可以允许稍微 更快的启动 次,但这取决于某种程度上的规模和复杂性的程序 在详细信息系统的装载战略。

一些修改,以包括非常相关的建议的评论意见和在其他的答案。我想请注意你的方式打破这在很大程度上取决于什么环境计划运行。最小的嵌入式系统可能没有足够的资源,以支持动态联系起来。稍大的小型系统可以支持动态联系,因为他们的记忆是小到足以让RAM节省的动态联系非常有吸引力。完全成熟的消费者电脑、作标记笔记,巨大的资源,并且你也许可以让的便利问题的驱动你的思想在这个问题。


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

经典的动态图书馆需要某种胶水层这通常意味着双派遣或一个额外的层之间在功能的解决并可以花费一点点的速度(但是功能呼叫的时间实际上很大一部分的你的运行时间???).

然而,如果运行多个程序的所有呼吁相同的图书馆有很多,你可以结束了节能的缓存线(并因此赢得对运行性能)当使用动态联系相对使用静态联系起来。(除非另有现代化的操作系统有足够的智慧来的通知完全相同的线段在静态连接的二进制文件。似乎很难,任何人都知道吗?)

另一个问题:装载时间。你装载支付的费用。当你支付这笔费用取决于如何OS工作以及为什么联你使用。也许你更愿意推迟支付它直到你知道你需要它。

注意静与动态联系是传统 一个优化的问题,因为它们既涉及单独的汇编下降到目文件。然而,这不是必需的:一个编译器,可以在原则上,"汇编"的"静态图书馆",以一个消化AST形式最初,"链接"他们通过加入这些Ast的那些产生于主要代码,从而赋予全球优化。没有一个系统我的使用做到这一点,所以我不能评论以及它如何运作。

的方式来回答性的问题是 总是 通过测试(和使用了测试环境,作为多喜欢的部署环境作为可能)。

其他提示

1)是基于这样的事实,呼吁DLL功能总是使用一个额外的间接跳。今天,这通常是可以忽略不计。内部DLL有一些更多的开销上i386CPU的,因为它们不能产生位置的独立代码。在amd64,跳可以是相对于该程序计数,因此这是一个巨大的改善。

2)这是正确的。优化导游通过分析通常可以赢得大约10-15%的业绩。现在,CPU速度已达到其限制,这可能是值得这样做。

我想补充:(3)连接可以安排的功能的更高速缓存的高效率进行分组,以便昂贵的高速缓存水平的失误降至最低。它还可能尤其影响的启动时间的应用(基于结果我看见太阳C++编译器)

不要忘记,与DLL没有死消除代码可以被执行。根据语言,DLL代码可能无法以最佳方式。虚拟功能总是虚拟的,因为编译器不知道是否有客户是复盖它。

由于这些原因,在没有真正需要DLL的,那么就使用的是静态的汇编。

编辑(以回答的意见,通过用户下划线)

这里是一个很好的资源大约位置的独立代码问题 http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/

如x86没有他们据我所知的任何其他然后15点跳范围并不是无条件的跳跃,并呼吁。这就是为什么职能(从发电机)具有超32千有直是一个问题,需要嵌入的蹦床。

但是,在受欢迎的x86Linux操作系统,如你刚才不需要关心如果所/DLL文件不会产生与 gcc 开关 -fpic (强制执行使用的间接跳表)。因为如果你不要,代码只是固定的像一个正常的连接会重新定位。但是,虽然这样做它使代码段不可共享,这将需要一个全面的映射代码从磁盘转存和接触所有可以使用之前(清空大部分的缓存,打TLB的)等。曾经有一段时间,这被认为是缓慢的...太缓慢。

所以你不会有任何好处了。

我不记得是什么操作系统(Solaris或FreeBSD)给我的问题与我建立的Unix系统,因为我只是不这样做,并想知道为什么它坠毁,直到我加的 -fPICgcc.

动态链接是满足一些许可证要求,如 LGPL 中的唯一可行的方法

我同意这点dnmckee提到,再加上:

  • 静态连接应用程序可能会更容易地部署,因为有很少或没有附加的文件的依赖(.dll/.因此)就可能会引起问题时,他们丢失或安装在错误的地方。

一个原因做一个静态链接版本是验证你的可执行文件,即全封闭,所有的符号引用正确解析。

作为正被建立和测试使用持续集成一个大系统的一部分,夜间回归测试使用的可执行文件的一个静态链接的版本上运行。有时,我们会看到一个符号没有解决,静态链接会失败,即使动态链接的可执行文件会成功链接。

这是通常发生时所深的共享库中就座符号有一个拼写错误名称等不会静态链接。动态连接器不能完全解决所有的符号,而不管使用深度优先或广度优先评价,所以可以使用动态链接的可执行不具有全封闭完成。。

1/我已经在项目的动态联vs静联基准和区别不确定足够小到关于动态链接(我是不是测试的一部分,我只是知道的结论)

2/的动态联系往往是与PIC的位置(位置的独立代码、代码的,它不需要修改根据的地址,在其它被装载).根据该结构的图片可能带来的另一个放缓,但是需要的,以便获得利益共享的动态相联系的图书馆之间可执行的两个(甚至两个进程相同的可执行如果操作系统使用随机的载荷的地址作为安全措施)。我不知道,所有操作系统允许分开的两个概念,但Solaris和Linux做ISTR,HP-UX并为好。

3/I已经在其他项目中使用动态联系的"易于修补"功能。但这一"易贴"使得分发的小修小易和复杂的一个版本控制的噩梦。我们往往最终通过具有推动一切,再加上具有跟踪问题,客户的网站,因为错误的版本是令牌。

我的结论是,我使用的静电联除外:

  • 喜欢的事情的插件,这取决于动态联系

  • 当共享是重要的(大图书馆使用通过多个进程的同时喜欢C/C++运行时,GUI库...这往往是独立管理和其ABI是严格的定义)

如果一个人希望使用"易于修补",我认为,图书馆必须设法类的大图书馆:他们必须近独立的定义ABI,必须不可改变的修正。

很详细讨论关于在Linux和性能影响共享库。

这是很简单的,真的。当你在你的源代码的改变,你要等待10分钟,它建立或20秒了吗?二十秒所有我可以忍受。除此之外,我要么走出剑或开始我如何可以使用单独的编译和链接,使其恢复到舒适区的想法。

在类似Unix的系统中,动态链接可以过不去“根”使用与安装在外的闭塞位置的共享库的应用程序。这是因为动态连接器一般不会注意LD_LIBRARY_PATH或其等价物具有root权限的进程。有时,然后,静态链接节省了一天。

可替换地,在安装过程中需要定位的库,但可以使其难以用于多个版本的软件到机器上共存。

动态链接需要额外的时间用于OS找到所述动态库和加载。与静态链接,一切都在一起,它是一个一次性加载到存储器中。

此外,请参阅 DLL地狱。这是该方案,其中的DLL加载操作系统是不是与您的应用程序附带的一个,或版本您的应用程序的期望。

用于动态链接最好的例子是,当该库是依赖于所使用的硬件。在古代C数学库决定是动态的,以使得每个平台可以使用所有处理器功能来优化它。

一个更好的实例可以是OpenGL的。 OpenGL是由AMD和NVIDIA不同的方式实现的API。你是不是能够使用的是NVIDIA的实现AMD卡上,因为硬件是不同的。你不能静态链接的OpenGL到你的程序,因为这一点。动态链接在这里用来让API来对于所有平台进行了优化。

尚未讨论在库修复错误的另一个问题。

使用静态链接,你不仅要重建库,但将不得不重新链接和redestribute可执行文件。如果库在一个可执行刚刚使用,这可能不是一个问题。但多个可执行需要被重新链接并重新分配,越大疼痛

通过动态链接,你只是重建和重新分配的动态库,和你做。

静态链接只给你一个exe文件,序,使您需要重新编译你的整个程序的变化。而在动态链接你需要做只对DLL变化,当您运行exe文件,修改将在runtime.Its拾起更容易通过提供动态更新和bug修复链接。(如:窗口)

有一个巨大和越来越多的系统中一个极端的水平,静态链接可以有一个巨大的积极影响的应用程序和系统性能。

我指的是什么常常被称为"嵌入式系统",其中有许多是现在越来越多地使用通用操作系统,这些系统的使用一切可以想象的。

一个极为常见的例子是设备的采用GNU/Linux系统的使用 .我已经采取了这样的极端 NetBSD 通过建立一个可启动i386(32位)系统图像,包括两个核心及其根文件系统,后者包含一个静态的联(通过 crunchgen)进制与硬链接到的所有程序本身就包含 所有 (以及在最近的一次统计274)的标准的完整功能的系统方案(最除了工具),则是不超过20 大型字节的大小(可能运行非常舒适地在一个系统只有64MB的存储器(即使根文件系统无压缩和完全RAM),虽然我已经无法找到一个如此小的测试).

它已经提到在早前的职位,开始时的一个静态的联的二进制文件的速度更快(它可以是一个 很多 更快的),但是只有画面的一部分,特别是当所有目标码链接到同一的文件,甚至更多,尤其是在操作系统支持的需求的寻呼码直接从可执行的文件。在这个理想的方案的启动时间的计划是 从字面上 可以忽略不计由于几乎所有页码就已经存在并被使用的壳(和 init 任何其他背景的过程,可能会运行),即使所请求的程序没有经营自启动以来,也许只有一页的记忆需要被加载到履行的运行要求的程序。

然而,仍然不是整个故事。我通常也生成和使用的NetBSD操作系统的安装,对于我的完整发展系统通过静联所有的二进制文件。尽管这需要大量更多的磁盘空间的(~6.6GB总x86_64的一切,包括工具和X11静电联)(特别是如果一个让全面的调试的符号表可用于所有程序的另一个~2.5GB),结果仍然运行速度更快的整体,对于某些任务,即使采用较少的内存于一个典型的动态联系,目的是分享图书馆码的网页。磁盘的是便宜的(甚至快速盘),并记忆缓存经常使用的磁盘文件,也是相对便宜,但CPU真的不是,并且支付 ld.so 启动成本为每一个进程的开始 时间开始,将需要几个小时和小时的CPU周期离开任务需要起许多过程,尤其是在相同程序中使用过,例如编译器在一个发展系统。静电联的工具链程序可以减少整个操作系统多的架构建立时间对于我的系统 小时.我还没有建立的工具进入我的单身 crunchgen'ed二进制的,但我怀疑,当我这样做将有更多小时的时间保存,因为赢得对CPU缓存。

静态链接包括所述文件中的单个可执行文件的程序的需要。

动态链接是什么,你会考虑平时,它使一个可执行文件,仍然需要DLL和这样是在同一目录(或DLL文件可能在系统文件夹)。

(DLL = <强>动态链接库)

动态链接的可执行被编译更快,并不像资源重

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top