前段時(shí)間寫(xiě)的一篇文章
最近做產(chǎn)品商城項(xiàng)目時(shí)翰意,因?yàn)檫@塊經(jīng)常變動(dòng)木人,不可能經(jīng)常提示用戶(hù)下載新版本升級(jí),于是決定用H5來(lái)實(shí)現(xiàn)冀偶,進(jìn)行無(wú)刷新升級(jí)醒第。期間遇到很多問(wèn)題,在兄弟們的努力下进鸠,總于完成了稠曼。沒(méi)事的時(shí)候也喜歡看看上線(xiàn)后的app,一開(kāi)始app剛加載時(shí)就很慢,現(xiàn)在感覺(jué)就更慢了客年,首頁(yè)也不是me寫(xiě)的霞幅,閑來(lái)無(wú)事就分析了一下原因,看看哪些地方占用了時(shí)間量瓜,索性就看看吧司恳。
使用Time Profiler的性能分析方法
Time Profiler分析原理:它按照固定的時(shí)間間隔來(lái)跟蹤每一個(gè)線(xiàn)程的堆棧信息,通過(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)都被選中邢享,如下:
這樣就確保所有的面板都被打開(kāi)。現(xiàn)在看一下下面的截圖和每一部分的說(shuō)明淡诗。
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)"的方法--換句話(huà)說(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è)線(xiàn)程被單獨(dú)考慮。這能讓你知道哪一個(gè)線(xiàn)程占用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)線(xiàn)程里操作,這里只是一個(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)啟子線(xiàn)程的操作爬范,那么這個(gè)方法也就是在首頁(yè) viewdidload 方法里面調(diào)用的,代表就是在UI線(xiàn)程進(jìn)行的文件copy
毋庸置疑弱匪,肯定會(huì)導(dǎo)致頁(yè)面卡頓坦敌。
那我們把它放到子線(xiàn)程進(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)化财搁,提升用戶(hù)體驗(yàn),切記躬络,優(yōu)化后要做一遍詳細(xì)的測(cè)試尖奔,要不然別修了東墻壞了西墻。