題外話:
我相信90%以上的iOS開發(fā)者不經(jīng)常使用xcode提供的instrument調(diào)試工具,畢竟用戶的實(shí)際體驗(yàn)才是第一感覺。既然xcode有這個(gè)工具,還是要研究下的:
遇到第一個(gè)問題:
instrument無法選擇真機(jī),無法進(jìn)行下一步操作了,這個(gè)重啟下xcode和iPhone就ok了
幾個(gè)工具:
Instruments 提供了很多功能,我會(huì)重點(diǎn)介紹一下我最常用的三大類:
Time Profiler:分析代碼的執(zhí)行時(shí)間,找出導(dǎo)致程序變慢的原因。
Allocations:監(jiān)測內(nèi)存使用/分配情況
迅速膨脹的內(nèi)存可以很快讓程序斃命,所以要多加防范。
Leaks:找到引發(fā)內(nèi)存泄漏的起點(diǎn)
即使有 ARC(自動(dòng)引用計(jì)數(shù))內(nèi)存管理機(jī)制,但在現(xiàn)實(shí)中對(duì)象之間引用復(fù)雜,循環(huán)引用導(dǎo)致的內(nèi)存泄漏仍然難以避免,所以關(guān)鍵時(shí)刻還要自力更生。
一、Time Profiler(函數(shù)調(diào)用時(shí)間)
幾個(gè)概念:
Separate By Thread:線程分離,只有這樣才能在調(diào)用路徑中能夠清晰看到占用CPU最大的線程.
Invert Call Tree:從上到下跟蹤堆棧信息.這個(gè)選項(xiàng)可以快捷的看到方法調(diào)用路徑最深方法占用CPU耗時(shí),比如FuncA{FunB{FunC}},勾選后堆棧以C->B->A把調(diào)用層級(jí)最深的C顯示最外面.
Hide Missing Symbols:如果dSYM無法找到你的APP或者調(diào)用系統(tǒng)框架的話,那么表中將看到調(diào)用方法名只能看到16進(jìn)制的數(shù)值,勾選這個(gè)選項(xiàng)則可以隱藏這些符號(hào),便于簡化分析數(shù)據(jù).
Hide System Libraries:這個(gè)就更有用了,勾選后耗時(shí)調(diào)用路徑只會(huì)顯示app耗時(shí)的代碼,性能分析普遍我們都比較關(guān)系自己代碼的耗時(shí)而不是系統(tǒng)的.基本是必選項(xiàng).注意有些代碼耗時(shí)也會(huì)納入系統(tǒng)層級(jí),可以進(jìn)行勾選前后前后對(duì)執(zhí)行路徑進(jìn)行比對(duì)會(huì)非常有用.
系統(tǒng)和應(yīng)用本身一些調(diào)用路徑完全揉捏在一起.完全看不到我們關(guān)心的應(yīng)用程序中實(shí)際代碼執(zhí)行耗時(shí)和代碼路徑實(shí)際所在位置.簡單的方式可以快速勾選右邊Call Tree中Separate Thread和Hide System Libraries兩個(gè)選項(xiàng)[后面會(huì)解釋選項(xiàng)作用]:
基本操作:點(diǎn)擊右邊設(shè)置選項(xiàng),線程分離、過濾掉系統(tǒng)性能分析。查看列表耗時(shí)線程堆棧信息,點(diǎn)擊可在右側(cè)看到具體函數(shù)。可跳入xcode查看函數(shù)。這里需要注意的是,工具把延時(shí)動(dòng)畫時(shí)間也計(jì)入到函數(shù)執(zhí)行時(shí)間,所以不能僅僅依靠數(shù)據(jù)時(shí)間大小來單純判定函數(shù)是否耗時(shí)。
二、Allocations(內(nèi)存分配)
這里只是摘抄作者的部分文章,作者寫的真的很全很全……
我們可以驚訝的看到All Heap Allocations(真實(shí)內(nèi)存)只有5.47,而All Anonymous VM(虛擬內(nèi)存:為程序分配的虛擬內(nèi)存,當(dāng)程序有需要的時(shí)候,能夠及時(shí)為程序提供足夠的內(nèi)存空間,而不會(huì)現(xiàn)用現(xiàn)創(chuàng)建)高達(dá)17.2,所以手機(jī)分配給我們的內(nèi)存是22.68;我們現(xiàn)在不檢測內(nèi)存泄漏(是另外一個(gè)工具),所以我們盡量優(yōu)化VM(因?yàn)椴皇莂pp真實(shí)占用的內(nèi)存,只是系統(tǒng)分配的),而VM主要由以下三部分組成:
1.VM:ImageIO_PNG_Data
這里原作者用的自動(dòng)釋放池。
2.VM:CG raster data
這里原作者用的sd框架的方法,在delegate實(shí)現(xiàn),確實(shí)減少了內(nèi)存占用。我這里暫時(shí)沒有去實(shí)踐。
3.VM:CoreAnimation
暫未解決
另外:Allocations工具右側(cè)mark generation標(biāo)記功能,可對(duì)比前后操作內(nèi)存增加量
參考文章寫得很清楚,本文下面有傳送門。
這個(gè)主要是參照其他人的文章啦
Time Profiler:(傳送門)
Allocations: (傳送門)