da Rocha Pires
da Rocha Pires

Reputation: 2492

iOS app launch time measurement

How can I count the time it takes from the moment the user presses the launch button on the home screen until the moment the app is active (for example, until the viewDidAppear method of the first view controller)?

Id does not need to be programmatically but must be reliable.

Analogously in Android, logcat can be used for this effect.

Upvotes: 12

Views: 10421

Answers (6)

Gleb Tarasov
Gleb Tarasov

Reputation: 885

There is a possibility to get process start time with 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;
}

In swift you will have something like this:

private static func processStartTime() -> TimeInterval {
    var kinfo = kinfo_proc()
    var size = MemoryLayout<kinfo_proc>.stride
    var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
    sysctl(&mib, u_int(mib.count), &kinfo, &size, nil, 0)
    let startTime = kinfo.kp_proc.p_starttime
    return TimeInterval(startTime.tv_sec) + TimeInterval(startTime.tv_usec) / 1e6
}

After that you can calculate startup time with the different ways.

For example I do:

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

Full post about that I found here

Upvotes: 4

garg
garg

Reputation: 2727

We used DYLD_PRINT_STATISTICS to measure our app’s pre-main() launch times

enter image description here

Upvotes: 4

sukesh
sukesh

Reputation: 171

You can go to edit scheme on Xcode and add a environment variable (DYLD_PRINT_STATISTICS = 1) as shown in the image enter image description here

When you run the app the details will be printed on debugger output as below:

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%)

Please watch the video for more details.

Upvotes: 12

iCode
iCode

Reputation: 320

Since you can't get the exact time when the user touches the app's icon on homescreen, I suggest to start your app from another app, so you can get the exact time your app starts.

  • Register a custom URL scheme in your app
  • create a helper-app that can launch your app by a url
  • log the time when the helper app launches your app (or send the timestamp to your app)
  • in your app log the time when launch is done at a appropriate place (AppDelegate or the main ViewController)
  • if you have sent the timestamp of the launch from the helper app, you can calculate the difference programmatically, otherwise just compare both times in the console

Upvotes: 0

Legolas
Legolas

Reputation: 12325

Start a timer in willFinishLaunchingWithOptions.....

Stop the timer in applicationDidBecomeActive, or viewDidAppear of the VC you are trying to profile, and NSLog it.

Upvotes: 0

matthewrdev
matthewrdev

Reputation: 12170

A simple implementation is to start a StopWatch in the applications main and then grab the time result in the ViewDidAppear method:

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);
    }
}

Upvotes: 0

Related Questions