微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何减少动态库加载时间?

如何解决如何减少动态库加载时间?

我有一个关于减少装载机时间的问题。

我有一个与189个共享库链接的二进制文件。我使用perf剖析了二进制文件,然后GNU加载程序ld.so占用了程序运行时间的40%,大约90毫秒的时间。

有什么方法可以优化动态库的加载时间,还是我不得不使用静态链接

我运行了很多次这个程序。

解决方法

  1. 避免在库中使用C ++构造函数,因为它们会导致构造函数本身运行,解析符号和从硬盘驱动器加载代码的延迟
  2. 通过使用-fvisibility=hidden编译库(并为要导出的符号有选择地使用__attribute__((visibility("default"))))来最小化导出符号的数量
  3. 使用--as-needed最小化库依赖性
  4. 确保已启用惰性绑定(即未设置LD_BIND_NOW并且库未使用-Wl,-z,now进行编译)
  5. 最后,您可以使用Prelink工具来静态地预先计算符号偏移量

可以通过导出LD_DEBUG=statistics

来测量库加载时间 ,

加载时间取决于几个因素:将库从媒体存储传输到内存所需的时间,要链接的符号数...以下是一些建议:

  1. 如果使用dlopen(),则可以设置延迟绑定标志( RTLD_LAZY
  2. 确保使用ldconfig使ld.so.cache保持最新(并在必要时更新ld.so.conf)以缩短库搜索时间。使用strace可能有助于查看尝试查找库文件的次数。还要检查 LD_LIBRARY_PATH 环境变量。
  3. 确保未设置 LD_BIND_NOW 环境变量,以使动态链接器(ld.so)以惰性模式运行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。