我正在调试iPhone应用程序(Xcode,Objective C++)的慢启动。这是一个带有三个选项卡的基于Tabbar的应用程序。所有三个标签都加载在一个NIB中 - 总共约有20个对象。iPhone上的慢启动
第一轮重要的初始化发生在第一个选项卡的视图控制器的viewDidLoad处理程序中。然而,main()和该方法的开始时间之间大约需要1秒 - 约为总加载时间的2/3。问题 - 在那段时间发生了什么,以及我如何调查这个问题(通过反汇编进行的步骤不足)?就我所知,在两个时刻之间没有我的代码 - 延迟完全发生在系统代码中。
也许某种仪器可以给我每个功能的时间档案?
该软件包总共约4 MB,但我在applicationDidFinishLaunching处理程序中加载了比此更大的最大文件(〜3.5 MB)。从捆绑中删除该文件并注释掉相关的代码对于1秒的延迟没有任何作用。
更新:毕竟有调试干扰。如果我在观看控制台的同时在设备上运行它,启动时间会大大缩短,延迟系统代码占我代码的比例也会出现偏差。但是,main和viewDidLoad之间存在明显的延迟,约占总加载时间的50%。
顺便说一句,从捆绑包中加载大文件到内存的所有方法中,最快的是直接内存映射(使用POSIX mmap())。
我正在计算程序内的时间,所以调试器的干扰应该是最小的。在main()得到控制的时候,调试器应该已经被连接了。 我知道他们建议为制表符分开NIB,但我尝试从第二个和第三个选项卡中删除所有内容 - 延迟几乎相同。 我运行了CPU监视器。有点难以解释。 :(它说72%的时间花在mach_msg_trap下 - 但不是系统的通用“等待事件”功能吗? – 2010-01-07 05:56:45
实际上,我发现调试器确实会造成显着的干扰,特别是在启动时间时。建议将您的代码记录到控制台的时间,在设备上手动启动应用程序,并从管理器中的设备中读取控制台日志中的时间。 – 2010-01-07 16:28:19
我已经使用NSLog()记录时间。是否会出现在管理器中? – 2010-01-07 20:27:04