Instruments 之 使用 Time Profiler 優(yōu)化啟動速度

在性能優(yōu)化過程中,啟動速度優(yōu)化一直是一個比較大的點林束。Apple 官方期望 APP 的啟動時間為 0.4 s像棘,用戶的期待時間為 2 s (來自調查)。不過作為開發(fā)者壶冒,當然希望我們的 APP 的啟動速度能夠盡可能的快缕题。若是對 Time Profiler 不熟悉的同學可以先閱讀一下先前的文章 Instruments 之 Time Profiler 使用

冷啟動和熱啟動

APP 啟動分為冷啟動(Cold Launches),當 APP 長時間沒有被啟動的時候胖腾,用戶再次啟動 APP 的時候就是冷啟動烟零,若是手機重啟之后,APP 的第一次啟動也是冷啟動咸作;冷啟動對應的是熱啟動(Warm Launches),當 APP 啟動時需要的 dylibs 仍然停留在設備的磁盤緩存的時候瓶摆,這個時候就是熱啟動,熱啟動的速度會更快性宏。

優(yōu)化案例

使用 Xcode 版本為 8.3.2 群井,設備為 iPhone 6 ,系統(tǒng)版本 10.3.1毫胜。 APP 每次啟動之前需要重啟一下手機书斜,達到冷啟動的效果诬辈。案例使用 raywenderlich 的
Catstagram 啟動優(yōu)化。該案例是一個帶圖片的列表荐吉。

Catstagram

優(yōu)化 before main()

before main()

APP 啟動優(yōu)化可以分為 2 個部分焙糟,一個部分在 main() 函數(shù)之前,另一部分在 main()函數(shù)之后样屠。對于 APP 的啟動細節(jié)可以參考 WWDC 的 Optimizing App Startup Time 章節(jié)穿撮,本文主要講使用 Time Profiler 來分析 APP ,然后根據分析結果來優(yōu)化 APP痪欲,著重講解 Time Profiler 的使用過程悦穿。
接下來,打開 Catstagram 案例业踢,添加 Scheme 的 DYLD_PRINT_STATISTICS 參數(shù)栗柒,并設置值為 YES,見下圖所示知举。該DYLD_PRINT_STATISTICS參數(shù)用于讓 Xcode 控制臺輸出 APP 在 before main() 時機之前的花費時間瞬沦。

Scheme
DYLD_PRINT_STATISTICS

設置好了之后,Command + R 在冷啟動情況下啟動 APP 雇锡,可以看到控制臺的輸出

Total pre-main time: 1.5 seconds (100.0%)
         dylib loading time: 814.09 milliseconds (52.6%)
        rebase/binding time:  52.20 milliseconds (3.3%)
            ObjC setup time: 241.27 milliseconds (15.6%)
           initializer time: 437.29 milliseconds (28.3%)
           slowest intializers :
             libSystem.B.dylib :  19.26 milliseconds (1.2%)
               AsyncDisplayKit : 145.63 milliseconds (9.4%)
                    Catstagram : 277.81 milliseconds (17.9%)

重點關注 Total pre-main time: 1.5 seconds (100.0%) 的信息逛钻,冷啟動情況在 pre-main 時機中可以看到信息 dylib loading time: 814.09 milliseconds (52.6%) ,也就是說我們的 dylib loading time 加載時間占據了 52.6% 锰提。聯(lián)想到我們的第三方庫是采用 pod 管理绣的,并且是 use_frameworks ,frameworks 是一個可優(yōu)化點欲账,

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'Catstagram' do
  use_frameworks!
  pod 'AFNetworking'
  pod 'AsyncDisplayKit', '~> 2.2'
  pod 'Yoga', '~> 1.3'
  pod 'Firebase', '~> 3.15'
  #pod 'FirebaseUI', '~> 3.1'
end
frameworks

這個 frameworks 是一個可優(yōu)化點屡江,打開 Podfile,并注釋掉 use_frameworks ,然后命令行執(zhí)行 pod install 命令 赛不,更新工程惩嘉,可以看到工程設置發(fā)生了變化。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'Catstagram' do
  #use_frameworks!
  pod 'AFNetworking'
  pod 'AsyncDisplayKit', '~> 2.2'
  pod 'Yoga', '~> 1.3'
  pod 'Firebase', '~> 3.15'
  #pod 'FirebaseUI', '~> 3.1'
end
非 frameworks

修改好了之后踢故,Command + R 在冷啟動情況下啟動 APP 文黎,查看控制臺的輸出。

Total pre-main time: 1.1 seconds (100.0%)
         dylib loading time: 470.55 milliseconds (39.6%)
        rebase/binding time:  31.07 milliseconds (2.6%)
            ObjC setup time: 255.35 milliseconds (21.4%)
           initializer time: 430.58 milliseconds (36.2%)
           slowest intializers :
             libSystem.B.dylib :  12.89 milliseconds (1.0%)
                    Catstagram : 792.04 milliseconds (66.6%)

從 log 中可以看到明顯的變化殿较,Total pre-main time 由之前 1.5 seconds 降到 1.1 seconds 耸峭。dylib loading time 由之前的 814.09 milliseconds (52.6%) 降到 470.55 milliseconds (39.6%) 。優(yōu)化效果非常明顯淋纲。

優(yōu)化 after main()

after main()

優(yōu)化完 before main() 之后劳闹,開始來優(yōu)化 after main()。從圖中可以看出啟動優(yōu)化的點是集中在 UIApplicationMain()上。
打開 Instruments 選擇 Time Profiler 來分析 APP本涕。

Time Profiler
launch 周期

選擇 APP 生命周期中的 Launching 生命周期來分析业汰,如上圖所示,可以清晰的看到耗時操作主要發(fā)生在 log 操作中菩颖,所以我們回到關于 log 的這段代碼代碼中样漆,它可能是一個可以優(yōu)化的點。

    func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

        let appearance = UINavigationBar.appearance()
        appearance.backgroundColor = .white
        appearance.barTintColor = .white

        CoolLogger.reportLogs()
        
        return true
    }

上述打 log 代碼在 main 線程中執(zhí)行晦闰,所以這段代碼是可以優(yōu)化的放祟,我們將這段代碼放到非 main 線程中執(zhí)行。

      DispatchQueue.global(qos: .background).async {
            CoolLogger.reportLogs()
        }

修改代碼之后呻右,重新啟動手機跪妥,讓 APP 進行冷啟動,繼續(xù)使用 Time Profiler 分析 APP,從下圖的分析結果總可以看到優(yōu)化取得了效果窿冯,APP 的 Laucning 生命周期沒有出現(xiàn) APP 的生命周期中,說明使用了及其短的時間來完成啟動确徙,這時間長度可以忽略醒串。

極速啟動

總結

Time Profiler 可以看到代碼的運行時長,配合它的Lift Cycle 工具可以用來優(yōu)化 APP 的啟動速度鄙皇。 Time Profiler 只是一個工具芜赌,它只能幫助記錄 APP 的運行狀態(tài),而開發(fā)者可以根據記錄的狀態(tài)分析 APP 的耗時操作伴逸,然后進行修改缠沈,再用 Time Profiler 驗證。

參考

本文是 raywenderlich 的課程筆記错蝴,內容參考 Practical Instruments 課程
1洲愤、Demo 項目 https://files.betamax.raywenderlich.com/attachments/videos/786/0965b118-95eb-492f-804c-3135c7347130.zip

2、https://videos.raywenderlich.com/courses/74-practical-instruments/lessons/4

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末顷锰,一起剝皮案震驚了整個濱河市柬赐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌官紫,老刑警劉巖肛宋,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異束世,居然都是意外死亡酝陈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門毁涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沉帮,“玉大人,你說我怎么就攤上這事∮鑫鳎” “怎么了馅精?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粱檀。 經常有香客問我洲敢,道長,這世上最難降的妖魔是什么茄蚯? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任压彭,我火速辦了婚禮,結果婚禮上渗常,老公的妹妹穿的比我還像新娘壮不。我一直安慰自己,他們只是感情好皱碘,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布询一。 她就那樣靜靜地躺著,像睡著了一般癌椿。 火紅的嫁衣襯著肌膚如雪健蕊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天踢俄,我揣著相機與錄音缩功,去河邊找鬼。 笑死都办,一個胖子當著我的面吹牛嫡锌,可吹牛的內容都是我干的。 我是一名探鬼主播琳钉,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼势木,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歌懒?” 一聲冷哼從身側響起跟压,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歼培,沒想到半個月后震蒋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡躲庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年查剖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噪窘。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡笋庄,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情直砂,我是刑警寧澤菌仁,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站静暂,受9級特大地震影響蔽莱,放射性物質發(fā)生泄漏缴淋。R本人自食惡果不足惜冗栗,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一见妒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郊供,春花似錦峡碉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疯淫,卻和暖如春地来,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峡竣。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工靠抑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留量九,地道東北人适掰。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像荠列,于是被迫代替她去往敵國和親类浪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • 當 APP 開發(fā)到了一定的階段肌似,性能優(yōu)化這個話題就會被提起费就,性能優(yōu)化的途徑有很多,不過通常都會使用到 Apple ...
    要上班的斌哥閱讀 7,271評論 0 21
  • 學習如何使用【Xcode Instruments】來進行錯誤排查和優(yōu)化代碼川队。 更新提示:這篇教程由James Fr...
    汝陰龍閱讀 1,268評論 0 1
  • 首先如果遇到應用卡頓或者因為內存占用過多時一般使用Instruments里的來進行檢測力细。但對于復雜情況可能就需要用...
    攻克乃還_閱讀 1,860評論 0 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • 愛情是棵山楂樹 春天小苗靠你助 嫩枝嫩芽勤付出 還要提防蟲兒蛀 愛情是棵山楂樹 枝繁葉茂更辛苦 雖有明月樹間照 也...
    玉露情歌閱讀 395評論 0 4