测量程序启动时动态链接所花费的时间?

Posted

技术标签:

【中文标题】测量程序启动时动态链接所花费的时间?【英文标题】:Measure time taken dynamically linking at program startup? 【发布时间】:2014-07-08 06:50:55 【问题描述】:

如何

想到的解决方案以及我犹豫的原因:

1) 在运行程序之前和 main 开始时打印一些东西。

这没有考虑到可能在 main 之前运行的代码——全局变量的初始化和任何结果函数调用。它不是开箱即用的自动化工具,而且它给我的印象是粗鲁和准确的可疑。

2) 空程序上的时间命令,该程序与要测试的程序具有所有相同的标头,并且动态链接到相同的库。

我不确定这个。我不知道编译器和链接器是否可以根据客户端代码的内容串通缩写动态链接,但似乎有可能。

编辑:在问这个问题 6 分钟后,我再次检查了 Google 上明显的搜索词,“测量动态链接所花费的时间”,并最终回到这里作为第一次点击。

【问题讨论】:

什么操作系统?答案会因此而大相径庭。 您可以更改默认加载程序来为您测量动态链接时间。然后使用LD_PRELOAD 和您的自定义加载程序启动您的程序。 你到底想做什么?如果您只想测量“启动”的时间,请使用time myapp --exit-in-main(并在主if (strcmp(argv[1], "--exit-in-main") == 0) exit(0);的开头添加一个选项。如果您想将其与“非动态”进行比较,请静态链接您的代码。在根据我的经验,这没什么区别,因为大部分加载时间是从磁盘读取相关代码,而不是动态链接库的“链接”部分。 【参考方案1】:

使用LD_DEBUG

试试这个:

LD_DEBUG=statistics ./myprog

它将输出各种统计信息的简短列表。一个例子:

xenon-lornix:~> LD_DEBUG=statistics ls
     22833:
     22833:     runtime linker statistics:
     22833:       total startup time in dynamic loader: 2500702 clock cycles
     22833:                 time needed for relocation: 757822 clock cycles (30.3%)
     22833:                      number of relocations: 155
     22833:           number of relocations from cache: 8
     22833:             number of relative relocations: 1253
     22833:                time needed to load objects: 1325154 clock cycles (52.9%)

显示有关加载/运行ls 命令的信息。

使用LD_DEBUG=help ./myprog 将显示可用于LD_DEBUG 的其他选项的名称。

更多信息可以在ld.sold-linux.so 手册页中找到(这些实际上是相同的)。 Google 搜索可以帮助您了解更多细节。

【讨论】:

LD_DEBUG=all ./myprog 会给你带来惊人的输出量......其中一些真的很有用! 哇,很好的答案。这些链接中还有很多其他漂亮的环境变量。谢谢。

以上是关于测量程序启动时动态链接所花费的时间?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:动态链接未启动应用程序

动态链接库(DLL)

未启动应用程序时 Firebase 动态链接不起作用

Firebase 动态链接在应用启动时不起作用

动态链接库

程序员自我修养阅读笔记——动态链接