dyld加载图像时如何分析调用初始化函数的时间?

Posted

技术标签:

【中文标题】dyld加载图像时如何分析调用初始化函数的时间?【英文标题】:How to profile the time of calling initializer functions when dyld loads an image? 【发布时间】:2010-09-19 06:12:21 【问题描述】:

我现在正在尝试优化应用程序的启动时间,并且目前希望减少操作系统映像加载程序所花费的时间。

从dyld(1)中,我找到了两个环境变量:DYLD_PRINT_STATISTICSDYLD_PRINT_INITIALIZERS

DYLD_PRINT_STATISTICS 使 dyld 打印有关 dyld 如何使用时间的统计信息。这是我在purge 命令后启动应用程序时的输出。

total time: 5.9 seconds (100.0%)
total images loaded:  130 (101 from dyld shared cache, 0 needed no fixups)
total segments mapped: 105, into 12914 pages with 840 pages pre-fetched
total images loading time: 1.8 seconds (31.0%)
total dtrace DOF registration time: 0.09 milliseconds (0.0%)
total rebase fixups:  137,658
total rebase fixups time: 1.1 seconds (19.4%)
total binding fixups: 28,502
total binding symbol lookups: 1,127, average images searched per symbol: 0.1
total binding fixups time: 452.28 milliseconds (7.6%)
total weak binding fixups time: 188.52 milliseconds (3.1%)
total bindings lazily fixed up: 130 of 1,164
total initializer time: 2.3 seconds (38.7%)
total symbol trie searches:    2611
total symbol table binary searches:    118
total images defining/using weak symbols:  13/65

显然,调用初始化函数会占用大量时间。所以我尝试DYLD_PRINT_INITIALIZERS 来获取初始化函数列表。

我实际上得到了它们,但没有关于它们的时间信息,例如时间戳,只有大量以下行:

dyld: calling initializer function 0x25170 in MY_APPLICATE_PATH

这对我寻找目标初始化器来优化是没有用的。

所以,我的问题是:

    有没有办法让dyld打印时间戳? 如果不可能,我可以使用其他方法来分析dyld 调用初始化函数的时间吗? DTraceInstruments 在这里适用吗? 感谢您对上述统计数据提出任何建议。

虽然我现在正在使用 OSX,但也欢迎任何适用于 Windows 的工具或有用信息。

谢谢

【问题讨论】:

【参考方案1】:

你能用this technique吗?

我看到一个大型应用程序启动缓慢,它正在加载大量 dll 并进行大量初始化。抽样会告诉你发生了什么,你可以修复它,它可能会让你大吃一惊。

例如,我永远不会猜到的是设置国际化字符串所花费的时间,其中许多是不必要的。另一个例子:不仅创建和初始化数据结构,而且破坏和重新创建它们,不必要的,因为东西被插入到菜单、树视图等中。

【讨论】:

以上是关于dyld加载图像时如何分析调用初始化函数的时间?的主要内容,如果未能解决你的问题,请参考以下文章

dyld 加载 Mach-O

如何修复 dyld:库未加载... 原因:找不到图像 中止陷阱:6?

libmpc - dyld:库未加载 - 原因:找不到图像

iOS之深入解析类加载的底层原理:类如何加载到内存中?

dyld:库未加载...原因:找不到合适的图像 Xcode Swift

“dyld:无法加载插入的库'/usr/lib/libgmalloc.dylib',因为找不到图像”