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

时间:2010-09-19 06:12:22

标签: c++ macos optimization profiling

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

从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

对于我来说,找到要优化的目标初始化器是没用的。

所以,我的问题是:

  1. 是否有任何方法可以使dyld打印时间戳?
  2. 如果不可能,我可以使用其他内容来分析dyld调用初始化函数的时间吗? DTraceInstruments适用于此处吗?
  3. 对上述统计数据的任何建议表示赞赏。
  4. 虽然我现在正在开发OSX,但欢迎使用Windows的任何工具或有用信息。

    谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用this technique吗?

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

例如,我从未猜到过的是设置国际化字符串所花费的时间,其中许多都不需要。另一个例子:不仅创建和初始化数据结构,而且销毁并不必要地重新创建它们,因为事物被插入到菜单,树视图等中。