我现在正在尝试优化应用程序的启动时间,目前希望减少操作系统映像加载程序所花费的时间。
从dyld(1),我发现了两个环境变量:DYLD_PRINT_STATISTICS
和DYLD_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
调用初始化函数的时间吗? DTrace
或Instruments
适用于此处吗?虽然我现在正在开发OSX,但欢迎使用Windows的任何工具或有用信息。
谢谢
答案 0 :(得分:0)
您可以使用this technique吗?
我看到一个大型应用程序启动缓慢,它正在加载大量的dll并进行大量初始化。采样将告诉你发生了什么,你可以解决,它可能会让你感到惊讶。
例如,我从未猜到过的是设置国际化字符串所花费的时间,其中许多都不需要。另一个例子:不仅创建和初始化数据结构,而且销毁并不必要地重新创建它们,因为事物被插入到菜单,树视图等中。