iOS应用在设备上的启动时间

您是否曾经对测量应用程序的不同技术指标感兴趣? 如构建时间,启动时间,CPU使用率,内存等。因为它们可能会在使用应用程序时引起良好或不良的用户体验。 今天我们将讨论发射时间


但是首先……在这里您找不到关于“如何优化发射时间? -这不是本文的主题。


有几种测量发射时间的方法:

  • 使用DYLD_PRINT_STATISTICS标志;
  • 使用xcrun ;
  • 使用Darwin C API手动进行计算。

设置此环境变量可让您分析时间。

为了优化主阶段前的时间,我建议您观看WWDC关于优化应用程序启动时间的演讲。

不幸的是,您无法手动处理此信息并将其发送到服务器。 好吧,实际上,您可以解析os日志,但这不是一件简单的任务。 而且它不在当前主题范围之内。

但是我们想跟踪实际用户的启动时间。 我们应该怎么做?

使用此开发命令行工具,您可以编写脚本来测量模拟器上的启动时间。 但实际用户也没有。

好吧,我们应该使用Darwin C API。 主要思想:比较系统启动我们的应用程序过程的时间和应用程序可用的时间。

您要做的就是用C编写一些代码。

  #include“ LaunchTimeMeasurer.h”
 #include ;
 #include ; double processUptime(){
     struct timeval currentTime;  // 1
     struct kinfo_proc processInfo // 2;
     size_t processInfoSize = sizeof(processInfo)// 3;
     int mib [] = {CTL_KERN,KERN_PROC,KERN_PROC_PID,getpid()};  // 4
    
     sysctl(mib,sizeof(mib)/ sizeof(int),&processInfo,&processInfoSize,NULL,0);  // 5
     gettimeofday(& currentTime,NULL);  // 6
    
    返回toSeconds(currentTime)-toSeconds(processInfo.kp_proc.p_starttime);  // 7
 } double toSeconds(struct timeval time){
     const int microsecondsInSecond = 1000000;
    返回time.tv_sec +(double)time.tv_usec / microsecondsInSecond;
 } 

让我们逐行浏览此代码。

  1. timeval是用于指定时间间隔的结构。 它包含两个成员:
  • tv_sec表示时间间隔,以秒为单位;
  • tv_usec表示时间间隔,以微秒为单位。 该值与tv_sec成员结合使用,以表示时间间隔的值不是秒的倍数。

2. kinfo_proc是一个结构,其中包含有关当前进程的大量信息,包括进程ID,进程名称等。

3.有关当前过程的信息大小。

4.数组描述为MIB(管理信息库,由sysctl作为树返回,具有几大类,如kern,net,vm)。

  • CTL_KERN —“高内核”:proc,限制
  • KERN_PROC —流程条目
  • KERN_PROC_PID —按进程ID进行过滤
  • getpid() —当前进程的ID

5. sysctl读取和/或写入内核参数。

6.函数获取当前时间,以秒和微秒表示,并将其存储在timeval中 结构体。

7.只需比较当前时间和时间开始过程之间的差异即可。

就这样。 您可以从主要零件代码或didFinishLaunchingWithOptions的开头或didFinishLaunchingWithOptions的结尾调用此函数。 取决于您要测量的内容。

您也可以在这里找到Swift实现。