簡體   English   中英

iOS 應用啟動時間測量

[英]iOS app launch time measurement

如何計算從用戶按下主屏幕上的啟動按鈕到應用程序處於活動狀態(例如,直到第一個視圖控制器的 viewDidAppear 方法)所花費的時間?

Id 不需要以編程方式,但必須是可靠的。

類似地,在 Android 中,logcat 可以用於此效果。

如圖所示,您可以在 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%)

請觀看視頻了解更多詳情。

我們使用 DYLD_PRINT_STATISTICS 來測量我們應用的 pre-main() 啟動時間

在此處輸入圖像描述

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

很快你就會有這樣的事情:

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
}

之后,您可以使用不同的方式計算啟動時間。

例如我這樣做:

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

關於我在這里找到的完整帖子

一個簡單的實現是在應用程序 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中啟動一個計時器.....

停止applicationDidBecomeActive中的計時器,或您嘗試分析的 VC 的viewDidAppear ,然后 NSLog 它。

由於您無法獲得用戶在主屏幕上觸摸應用程序圖標的確切時間,因此我建議您從另一個應用程序啟動您的應用程序,這樣您就可以獲得應用程序啟動的確切時間。

  • 在您的應用中注冊自定義 URL 方案
  • 創建一個可以通過 url 啟動您的應用程序的助手應用程序
  • 記錄助手應用程序啟動您的應用程序的時間(或將時間戳發送到您的應用程序)
  • 在您的應用程序日志中,在適當的位置(AppDelegate 或主 ViewController)完成啟動的時間
  • 如果您已從幫助應用程序發送了啟動的時間戳,您可以通過編程方式計算差異,否則只需在控制台中比較兩個時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM