app性能優(yōu)化之Time Profiler工具的使用

前段時(shí)間寫(xiě)的一篇文章
最近做產(chǎn)品商城項(xiàng)目時(shí),因?yàn)檫@塊經(jīng)常變動(dòng),不可能經(jīng)常提示用戶下載新版本升級(jí),于是決定用H5來(lái)實(shí)現(xiàn),進(jìn)行無(wú)刷新升級(jí)。期間遇到很多問(wèn)題,在兄弟們的努力下,總于完成了。沒(méi)事的時(shí)候也喜歡看看上線后的app,一開(kāi)始app剛加載時(shí)就很慢,現(xiàn)在感覺(jué)就更慢了,首頁(yè)也不是me寫(xiě)的,閑來(lái)無(wú)事就分析了一下原因,看看哪些地方占用了時(shí)間,索性就看看吧。

使用Time Profiler的性能分析方法

Time Profiler分析原理:它按照固定的時(shí)間間隔來(lái)跟蹤每一個(gè)線程的堆棧信息,通過(guò)統(tǒng)計(jì)比較時(shí)間間隔之間的堆棧狀態(tài),來(lái)推算某個(gè)方法執(zhí)行了多久,并獲得一個(gè)近似值。其實(shí)從根本上來(lái)說(shuō)與我們的原始分析方法異曲同工,只不過(guò)其將各個(gè)方法消耗的時(shí)間統(tǒng)計(jì)起來(lái)。
和使用 Instruments的其他工具一樣,點(diǎn)擊XCode的Product菜單Profile啟動(dòng)Instruments 然后選擇TimeProfiler

首先,確保右手邊工具欄上的視圖選擇器的每一個(gè)選項(xiàng)都被選中,如下:

1435031528317977.png

這樣就確保所有的面板都被打開(kāi)?,F(xiàn)在看一下下面的截圖和每一部分的說(shuō)明。
1435031539770546.png

1、這里控制記錄過(guò)程,點(diǎn)擊紅色的"記錄"按鈕可以停止或開(kāi)始當(dāng)前正在分析的app(在記錄和停止按鈕之間切換),暫停鍵,如你所想,暫停當(dāng)前正在運(yùn)行的app。
2、這里是執(zhí)行計(jì)時(shí)器(run timer),計(jì)時(shí)器記錄著正在分析的app執(zhí)行了多長(zhǎng)時(shí)間、執(zhí)行了多少次。如果你使用記錄控制按鈕來(lái)停止你的app,然后重啟,這將創(chuàng)建一個(gè)新的運(yùn)行記錄,同時(shí)會(huì)顯示"Run 2 of 2"。
3、這里被稱(chēng)作路徑(track),就你選擇的Time Profiler工具而言,因?yàn)橹挥幸粋€(gè)工具,所以這里只有一條路徑,關(guān)于這里顯示的圖標(biāo)的詳情,一會(huì)你就會(huì)在接下來(lái)的教程中了解更多。
4、這里是詳情面板,展示的是你正在使用的工具的主要信息。就現(xiàn)在而言,這里展示的是最"笨重(hottest)"的方法--換句話說(shuō),占用CPU時(shí)間最長(zhǎng)的方法。點(diǎn)擊上方的bar會(huì)看到Call Tree(左手邊的那個(gè))并選中Sample List,然后你會(huì)看到數(shù)據(jù)的不同視圖。視圖展示了每一個(gè)示例。點(diǎn)擊其中幾個(gè),你會(huì)在Extended Detail inspector中看到被捕獲的堆棧跟蹤。
5、這里是檢查器(inspector)面板,一共有三個(gè)檢查器:record setting(記錄設(shè)置),display setting(展示設(shè)置),還有extends detail(擴(kuò)展詳情)。
在右手邊,選擇display setting(或者按下commond+2),在該選擇器中,在Call Tree欄下選中Separate by Thread, Invert Call Tree和** Hide System Libraries**選項(xiàng),你的界面應(yīng)該看起來(lái)是這樣的:

下面解釋了每一個(gè)選項(xiàng)對(duì)左側(cè)列表中數(shù)據(jù)的顯示起了什么作用:
Separate by Thread:每個(gè)線程被單獨(dú)考慮。這能讓你知道哪一個(gè)線程占用CPU最多。

Invert Call Tree:選中該選項(xiàng)后,調(diào)用棧會(huì)自上至下顯示。這通常是你需要的,因?yàn)槟阆胫繡PU花費(fèi)時(shí)間的那個(gè)最深的方法。

Hide System Libraries:選中該選項(xiàng)后,只有你自己app中出現(xiàn)的符號(hào)會(huì)被顯示出來(lái)。通常選中該選項(xiàng)是有用的,因?yàn)槟阒魂P(guān)心CPU在你自己的代碼中的哪一部分花費(fèi)時(shí)間,你沒(méi)法對(duì)系統(tǒng)庫(kù)使用CPU做多少改變。

Flatten Recursion:該選項(xiàng)將每一個(gè)調(diào)用棧中的遞歸函數(shù)(調(diào)用它們自身的函數(shù))視作單一入口,而不是多入口。

Top Functions:選上這一選項(xiàng)讓Instruments將花費(fèi)在一個(gè)函數(shù)中的總時(shí)間視作在該函數(shù)中直接花費(fèi)的時(shí)間加上調(diào)用的其他函數(shù)花費(fèi)的時(shí)間。所以如果函數(shù)A調(diào)用了函數(shù)B,那么函數(shù)A花費(fèi)的總時(shí)間被記為A花費(fèi)的時(shí)間加上B花費(fèi)的時(shí)間。這一選項(xiàng)非常有用,因?yàn)樗茏屇阍诿看芜M(jìn)入調(diào)用棧時(shí)找到花費(fèi)最長(zhǎng)的時(shí)間,瞄準(zhǔn)你最耗時(shí)的方法。

下面我們來(lái)開(kāi)始分析原因,這是應(yīng)用第一次進(jìn)入首頁(yè)的詳情面板:



好嘛,占整個(gè)首頁(yè)加載時(shí)間的13% 而且確實(shí)也是商城問(wèn)題導(dǎo)致的,這一塊是解壓縮文件用的,是個(gè)耗時(shí)的操作,不知有沒(méi)有放在后臺(tái)線程里操作,這里只是一個(gè)具體的方法,我們看看都有誰(shuí)調(diào)用了它,點(diǎn)擊那一行的左箭頭就可以展開(kāi)查看所有調(diào)用者:


展開(kāi)后看一下最后三行,它在首頁(yè)的 viewdidLoad 方法中在初始化首頁(yè)底部時(shí),加載商城數(shù)據(jù)時(shí),調(diào)用的解壓縮操作,雙擊可以
查看具體代碼實(shí)現(xiàn),我們選中雙擊[Mall initMallConfig:]進(jìn)去后看一下



這是一個(gè)拷貝資源的方法,我們跟進(jìn)去看一下:



并沒(méi)有發(fā)現(xiàn)任何開(kāi)啟子線程的操作,那么這個(gè)方法也就是在首頁(yè) viewdidload 方法里面調(diào)用的,代表就是在UI線程進(jìn)行的文件copy
毋庸置疑,肯定會(huì)導(dǎo)致頁(yè)面卡頓。
那我們把它放到子線程進(jìn)行操作看看效果:


耗時(shí)的資源壓縮復(fù)制放到后臺(tái)執(zhí)行 首頁(yè)加載從851ms降到了 70ms ,加載速度顯著提升.
總結(jié):性能優(yōu)化是在所有更能實(shí)現(xiàn)完成時(shí)要做的事,使用Time Profile工具分析app每個(gè)流程的執(zhí)行情況,發(fā)現(xiàn)耗時(shí)的地方,合理優(yōu)化,提升用戶體驗(yàn),切記,優(yōu)化后要做一遍詳細(xì)的測(cè)試,要不然別修了東墻壞了西墻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容