sud*_*sud 7 shared-libraries static-libraries
我有一个关于共享库与静态库加载时间的问题.
假设我有一个使用liba,libb,libc的可执行文件foo.exe.此外,在给定时间,机器上运行的可执行文件的实例超过10个.
现在,如果上面的3个库是共享库:第1个Insance被加载到RAM中:所需的时间是foo.exe的main()加载内存所占用的时间(假设可以忽略不计)+加载liba的时间+加载时间libb +加载libc的时间启动第二个实例:现在假设运行此可执行文件的第二个实例.由于所有库都已加载到主存储器中,因此只需将main()加载到可忽略不计的内存中.
现在,如果上述3个图书馆是静态库:第一Insance被加载到RAM:加载利巴+时间来加载采取将通过主)foo.exe的采取(时间被加载存储器(假设其忽略不计)+时间的时间libb +加载libc的时间(Offcourse现在它是整个可执行文件的所有部分)第二个实例启动:现在假设运行这个可执行文件的第二个实例.所花费的时间将是再次)foo.exe的由主所花费的时间(被加载存储器(假设其忽略不计)+时间来加载利巴+时间来加载libb +时间来加载的libc.(因为每个可执行文件都不能共享图书馆,因为这些是静态图书馆)
所以我的结论是,使用静态库,加载时间会更长.但我被告知共享库在加载过程中比静态库花费更多时间,因此会有延迟,因此共享库不是一个好选择.这怎么可能 ?
Pas*_*uoq 10
链接(解析引用)不是免费的.使用静态链接,在生成二进制文件时,一劳永逸地完成分辨率.使用动态链接时,必须在每次加载二进制文件时完成.更不用说编译为在共享库中运行的代码可能比编译为静态链接的代码效率低.确切的成本取决于体系结构和系统的动态链接实现.
对于32位x86指令集,使库动态化的成本相对较高:在ELF二进制格式中,必须牺牲一个已经稀缺的寄存器来使动态链接的代码可重定位.较旧的a.out格式将每个共享库放在固定的位置,但是没有扩展.我认为,当动态库放置在地址空间中的预定位置时,Mac OS X有一个中间系统,但冲突是在单个计算机的规模上解决的(安装新计算机后的冗长的"优化系统性能"阶段)软件).在某种程度上,这个系统(称为预绑定)允许你吃蛋糕也吃.我不知道是否仍然需要预绑定,因为Apple几乎切换到了amd64架构.
此外,在现代操作系统上,静态和动态链接的代码仅在使用时从磁盘加载(分页),但这与您的问题非常正交.