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; }
让我们逐行浏览此代码。
- 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实现。