iOS应用程序启动时间测量

时间:2016-03-10 23:41:04

标签: ios objective-c iphone swift xamarin

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

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

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

6 个答案:

答案 0 :(得分:2)

您可以在Xcode上编辑方案并添加环境变量(DYLD_PRINT_STATISTICS = 1),如图像enter image description here

所示

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

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了解详情。

答案 1 :(得分:1)

一个简单的实现是在应用程序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);
    }
}

答案 2 :(得分:1)

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

enter image description here

答案 3 :(得分:0)

由于您无法获得用户触摸主屏幕上应用程序图标的确切时间,因此我建议您从其他应用启动应用,这样您就可以获得应用启动的准确时间。< / p>

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

答案 4 :(得分:0)

可以使用 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;
}

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

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

例如我这样做:

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

关于我发现的完整帖子 here

答案 5 :(得分:-1)

willFinishLaunchingWithOptions .....

中启动计时器

在您尝试配置的VC的applicationDidBecomeActiveviewDidAppear中停止计时器,并对其进行NSLog。