iOS 啟動(dòng)時(shí)間度量 & 實(shí)驗(yàn) (XCTest Metrics)

背景介紹

關(guān)鍵字: iOS 性能測試 質(zhì)量保證明 QA 啟動(dòng)時(shí)間

無論是競品對比、還是公司內(nèi)部的多個(gè)產(chǎn)品的橫向比較、某產(chǎn)品的 App 在版本之間的性能監(jiān)控,都需要有一種標(biāo)準(zhǔn)來衡量性能表現(xiàn),比如本文要講述的啟動(dòng)時(shí)間。

從點(diǎn)擊 App 圖標(biāo)開始,計(jì)算到畫面渲染個(gè)差不多的時(shí)候(謎一樣的定義),通過高速時(shí)間戳錄制,來做差計(jì)算一個(gè)值,成為某版本的啟動(dòng)性能指標(biāo)。該方法的定義模糊性加上不同人員的操作不可控性,導(dǎo)致測量結(jié)果基本無意義,或者說這樣的誤差已經(jīng)大于性能發(fā)生變化的單位值了,開發(fā)也不會(huì)信服這樣的度量結(jié)果。

總之:要度量性能,不要估計(jì)性能。 (from WWDC)

之前基于 Instruments 逆向的一些路又彎又長,看到官方發(fā)布度量標(biāo)準(zhǔn)簡直感激涕零。

WWDC 2019 發(fā)布了 XCTest Metrics 相關(guān)的一些工具,助力開發(fā)者度量 App 的性能。包括 XCTest Metrics, MetricKit, Xcode Metrics Orgnizer. 它們分別針對軟件產(chǎn)品的開發(fā)、測試、上線等不同階段進(jìn)行性能度量。本文首先分享下我本次對于 iOS App 啟動(dòng)過程的學(xué)習(xí)心得,歡迎大家批評(píng)指正。


在 Xcode 11 集成的功能中,菜單欄 Window - Organizer 可以找到下圖界面,這里對于 App 的啟動(dòng)時(shí)間做了一個(gè)條形圖展示。

XcodeOrganizer.png

可以看到在 Launch Time 這個(gè)標(biāo)題下面有一行小字:

Time to first frame

意思是展示的時(shí)間表示截止到 App 畫面的第一幀渲染的時(shí)間。這里涉及到一個(gè)渲染過程,我們簡單看下 WWDC 2019 上展示的 App 啟動(dòng)階段分析:


App 啟動(dòng)階段.png

官方 Keynote 十分用心,不同階段使用不同顏色對應(yīng)表示,一目了然??梢钥吹皆?400 ms 結(jié)束的時(shí)候,有一個(gè) Initial Frame Render 過程結(jié)束了。App 運(yùn)行的過程就是一個(gè)無限循環(huán)的過程(Runloop),每秒 60 幀的流暢定義就是基于這個(gè) frame 的值產(chǎn)生的。當(dāng)我們 App 繪制出界面的第一幀的時(shí)候,其實(shí) App 的整個(gè)初始化的過程就完成了。官方基于此開發(fā) Launch Time 性能度量工具。

為什么畫面開始渲染的時(shí)候就能停止啟動(dòng)性能的度量了呢?
我們來看下這張圖:


App 啟動(dòng)周期內(nèi)的拓展階段.png

在 Extend 階段中,App 已經(jīng)是可交互、有響應(yīng)、開始顯示異步加載的一些網(wǎng)絡(luò)數(shù)據(jù)的狀態(tài)了。比如首頁的 Feed 流中的圖片列表,可以使用 SDWebimage 等第三方框架進(jìn)行異步加載。但是這個(gè)異步過程與啟動(dòng)過程應(yīng)當(dāng)是分開的。

來考慮這樣一個(gè)場景:

  1. 給 iPhone 網(wǎng)絡(luò)限速為 5kb/s, 此時(shí)首次打開新聞?lì)?App 花費(fèi)了 30 s 才將所有畫面加載完,此時(shí)能說啟動(dòng)花費(fèi)了半分鐘么?
  2. 另一個(gè)例子,打開一個(gè)復(fù)雜市區(qū)的百度地圖場景,前 3 秒出現(xiàn)了主干道路,然后又花費(fèi)了 5 秒獲取到了各種小路和店鋪等各種信息。

XCTest Metrics 的基本使用

XCTest Metrics 測量啟動(dòng)時(shí)間.png

結(jié)果 - 使用小米家庭 App 做個(gè) Demo

通過 xcodebuild 命令行輸出和 Xcode 界面運(yùn)行 XCTest,都可以看到啟動(dòng)時(shí)間的運(yùn)行結(jié)果。

小米家庭啟動(dòng)測量結(jié)果.png

XCTest Metrics 測量結(jié)果為 0.443 s
下面是告訴時(shí)間戳的計(jì)算結(jié)果:

起始點(diǎn).png
結(jié)束點(diǎn).png

時(shí)間差:0.904 - 0.437 = 0.467 s

通過實(shí)驗(yàn)對比,發(fā)現(xiàn)從系統(tǒng)接收到用戶的點(diǎn)擊事件(圖標(biāo)變灰),到界面出現(xiàn)第一幀(而不是所有圖片加載完),屏幕告訴時(shí)間戳計(jì)算的差值十分接近 XCTest Metrics 度量結(jié)果,僅存的誤差應(yīng)該是人眼判斷的第一幀出現(xiàn)時(shí)間比實(shí)際的第一幀出現(xiàn)時(shí)間晚導(dǎo)致的。

通過集成到 Jenkins 可以完成自動(dòng)化流程,并傳入到前端匯總展示,撒花~

一些提示

  1. 啟動(dòng)時(shí)間要同時(shí)間對比新設(shè)備和舊設(shè)備。
  2. 可以開啟飛行模式或者 mock 網(wǎng)絡(luò)請求來測試啟動(dòng)性能。
  3. 不要更改 iCloud 賬戶,防止賬戶同步影響啟動(dòng)過程
  4. 盡量使用 App Store 等正式版本的安裝包。

關(guān)于 App 啟動(dòng)方式

  1. 冷啟動(dòng)
    將手機(jī)關(guān)機(jī),靜置2分鐘。然后開機(jī)后啟動(dòng)某 App。該流程中 App 在內(nèi)存中是沒有初始進(jìn)程的。
  2. 熱啟動(dòng)
    將 App 通過多任務(wù)界面殺掉,然后再次打開,依次循環(huán)操作。該流程中 App 部分內(nèi)容是殘留在內(nèi)存中的。
  3. 恢復(fù)啟動(dòng)
    按下 Home 按鍵將 App 放入后臺(tái),此時(shí) App 完全在內(nèi)存中存活,進(jìn)程也正常存在,再次點(diǎn)擊 App 圖標(biāo)。

求點(diǎn)贊,求關(guān)注,求動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容