【问题标题】:Canonical method of measuring iOS app startup performance?衡量iOS应用启动性能的规范方法?
【发布时间】:2011-09-17 14:29:18
【问题描述】:

有人要求我减少 iOS 应用程序的启动时间。我对一般的平台/工具非常熟悉,但我之前没有关注应用程序的启动时间。我想知道是否有已知的模式来解决这个问题?

我意识到我可以简单地测量从 main() 到完成 application:didFinishLaunchingWithOptions: (包括任何后台加载任务)所需的时间,但我希望可能有一种更标准化的方法来这样做。

任何建议将不胜感激!

-M

【问题讨论】:

    标签: objective-c ios performance app-startup


    【解决方案1】:

    来自 WWDC 2012 会议 235

    main.m的第一行代码处设置起点

    #import <UIKit/UIKit.h>
    
    CFAbsoluteTime StartTime;
    
    int main(int argc, char *argv[])
    {
        StartTime = CFAbsoluteTimeGetCurrent();
    
        @autoreleasepool {
            ...
    

    AppDelegateapplication:didFinishLaunchingWithOptions:中某处设置终点

    extern CFAbsoluteTime StartTime;
     ...
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime);
    });
    

    【讨论】:

    • 你为什么要dispatch_async那个?由于您在下一个运行循环中排队,它将通过时间测量。可能差别不大,但似乎是完全不必要的不​​准确来源。
    • @jshier dispatch_async 用于在用户实际与应用程序交互时打印日志。主队列在application:didFinishLaunchingWithOptions 中被阻塞,我们想知道主线程何时真正完成所有工作。
    • 这有点尴尬,application:didFinishLaunchingWithOptions在主线程上,那为什么还要在主线程上再次dispatch呢?我认为首先停止计时器 viewDidAppear 可能更合理一些,但我没有观看会议,可能会遗漏一些东西。
    • 即使application:didFinishLaunchingWithOptions 在主线程上完成,主线程上可能还有其他几个调用排队,这些调用将在后续的运行循环中使用。这可以确保这些也完成,这是衡量用户何时可以使用应用程序的好方法,因为他们的交互将位于此队列的后面。
    【解决方案2】:

    您的方法听起来很正确(我建议您使用 CFAbsoluteTime 进行测量)。

    可以帮助您减少启动时间的一件事是避免在应用程序启动时从 nib 加载视图控制器。如果我没记错的话,这甚至会在您的应用程序启动之前强制它们被加载到内存中。相反,在需要时动态分配和初始化视图控制器。请注意,您仍然可以让视图控制器加载您希望存储在 Nibs 中的视图,您不必停止使用 IB。只是不要使用 IB 为您的应用程序委托设置静态插座。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多