【问题标题】:iOS app launch time measurementiOS 应用启动时间测量
【发布时间】:2016-03-10 23:41:03
【问题描述】:

如何计算从用户按下主屏幕上的启动按钮到应用处于活动状态(例如,直到第一个视图控制器的 viewDidAppear 方法)所花费的时间?

Id 不需要以编程方式,但必须是可靠的。

在Android中类似地,logcat可以用于这个效果。

【问题讨论】:

    标签: ios objective-c iphone swift xamarin


    【解决方案1】:

    您可以在 Xcode 上编辑方案并添加一个环境变量 (DYLD_PRINT_STATISTICS = 1),如图所示

    当您运行应用程序时,详细信息将打印在调试器输出中,如下所示:

    Total pre-main time: 481.88 milliseconds (100.0%)
             dylib loading time:  71.70 milliseconds (14.8%)
            rebase/binding time:  53.66 milliseconds (11.1%)
                ObjC setup time:  40.04 milliseconds (8.3%)
               initializer time: 316.33 milliseconds (65.6%)
               slowest intializers :
                 libSystem.B.dylib :  16.71 milliseconds (3.4%)
    

    更多详情请关注video

    【讨论】:

      【解决方案2】:

      我们使用 DYLD_PRINT_STATISTICS 来衡量我们应用的 pre-main() 启动时间

      【讨论】:

        【解决方案3】:

        有可能使用 C api 获取进程开始时间

        #import <sys/sysctl.h>
        
        static CFTimeInterval processStartTime() {
            size_t len = 4;
            int mib[len];
            struct kinfo_proc kp;
        
            sysctlnametomib("kern.proc.pid", mib, &len);
            mib[3] = getpid();
            len = sizeof(kp);
            sysctl(mib, 4, &kp, &len, NULL, 0);
        
            struct timeval startTime = kp.kp_proc.p_un.__p_starttime;
            return startTime.tv_sec + startTime.tv_usec / 1e6;
        }
        

        您也可以快速执行此操作,但这会更冗长。示例可以在CwlUtils 中找到。

        之后你可以用不同的方式计算启动时间。

        例如我这样做:

        let currentTime = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970
        let startupTime = currentTime - processStartTime()
        

        关于我找到here的完整帖子

        【讨论】:

        • 这是返回毫秒数吗?
        • 不,CFTimeInterval 以秒为单位,与NSTimeInterval 相同
        • 对于一个 swift 应用程序,你在哪里调用这 2 行?在 AppDelegate 中,对吧? AppDelegate 中有什么特别之处?
        • 这取决于您要测量什么。如果您想测量应用程序启动(在显示任何 UI 之前)需要多长时间:您可以在 application:didFinishLaunching: 中测量它。如果你想测量the same as Apple measures it:你可以在你的第一个可见视图控制器的viewDidLayoutSubviews 的第一次调用中进行。也可以将其放入第一个视图控制器的viewDidAppear 中。
        • 谢谢!如果您在application:didFinishLaunching: 中进行操作,您是否获得了“主前时间”?苹果是否获得了“后主时间”+“主前时间”?
        【解决方案4】:

        一个简单的实现是在应用程序main中启动一个StopWatch,然后在ViewDidAppear方法中获取时间结果:

        public class Application
        {
            public static Stopwatch StartUpTimer;
        
            static void Main(string[] args)
            {
                    StartUpTimer = new Stopwatch();
                    StartUpTimer.Start();
                    UIApplication.Main(args, null, "AppDelegate");
            }
        }
        
        public class MyUIViewController : UIViewController
        {
            public override void ViewDidAppear (bool animated)
            {
        
                Console.WriteLine (Application.StartUpTimer.ElapsedMilliseconds.ToString () + "ms to startup");
                base.ViewDidAppear (animated);
            }
        }
        

        【讨论】:

        • 问题标记为 Objective-C。
        • 应用程序启动包括两个阶段 1) pre-main 和 2) post-main 调用。作者提出的问题是一种衡量 pre-main + post-main 发布时间的方法。测量从 didLaunch 方法调用到第一个 viewDidAppear 所经过的时间基本上是一个 post-main 测量
        【解决方案5】:

        willFinishLaunchingWithOptions启动一个计时器.....

        在您尝试分析的 VC 的 applicationDidBecomeActiveviewDidAppear 中停止计时器,然后对其进行 NSLog。

        【讨论】:

        • 这不会从用户点击应用图标时开始跟踪时间。
        • 这是唯一的方法。 @rmaddy
        • main 开始时启动计时器比在willFinishLaunchingWithOptions... 开始时要好得多。但即使这样也不能真正做到 OP 要求的(这真的做不到)。
        【解决方案6】:

        由于您无法获得用户在主屏幕上触摸应用图标的确切时间,因此我建议您从另一个应用启动您的应用,这样您就可以获得应用启动的确切时间。

        • 在您的应用中注册自定义 URL 方案
        • 创建一个可以通过 url 启动您的应用的辅助应用
        • 记录助手应用启动您的应用的时间(或向您的应用发送时间戳)
        • 在您的应用日志中显示在适当位置(AppDelegate 或主 ViewController)启动的时间
        • 如果您已从帮助应用程序发送了启动时间戳,则可以通过编程方式计算差异,否则只需在控制台中比较两个时间

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-17
          • 2018-01-15
          • 1970-01-01
          • 2015-03-02
          • 2010-09-23
          • 2013-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多