【发布时间】:2016-03-10 23:41:03
【问题描述】:
如何计算从用户按下主屏幕上的启动按钮到应用处于活动状态(例如,直到第一个视图控制器的 viewDidAppear 方法)所花费的时间?
Id 不需要以编程方式,但必须是可靠的。
在Android中类似地,logcat可以用于这个效果。
【问题讨论】:
标签: ios objective-c iphone swift xamarin
如何计算从用户按下主屏幕上的启动按钮到应用处于活动状态(例如,直到第一个视图控制器的 viewDidAppear 方法)所花费的时间?
Id 不需要以编程方式,但必须是可靠的。
在Android中类似地,logcat可以用于这个效果。
【问题讨论】:
标签: ios objective-c iphone swift xamarin
您可以在 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。
【讨论】:
有可能使用 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 相同
application:didFinishLaunching: 中测量它。如果你想测量the same as Apple measures it:你可以在你的第一个可见视图控制器的viewDidLayoutSubviews 的第一次调用中进行。也可以将其放入第一个视图控制器的viewDidAppear 中。
application:didFinishLaunching: 中进行操作,您是否获得了“主前时间”?苹果是否获得了“后主时间”+“主前时间”?
一个简单的实现是在应用程序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);
}
}
【讨论】:
在willFinishLaunchingWithOptions启动一个计时器.....
在您尝试分析的 VC 的 applicationDidBecomeActive 或 viewDidAppear 中停止计时器,然后对其进行 NSLog。
【讨论】:
main 开始时启动计时器比在willFinishLaunchingWithOptions... 开始时要好得多。但即使这样也不能真正做到 OP 要求的(这真的做不到)。
由于您无法获得用户在主屏幕上触摸应用图标的确切时间,因此我建议您从另一个应用启动您的应用,这样您就可以获得应用启动的确切时间。
【讨论】: