一拘领、Instruments簡(jiǎn)介
(1)Instruments 是應(yīng)用程序用來(lái)動(dòng)態(tài)跟蹤和分析 Mac OS X 和 iOS 代碼的實(shí)用工具。 這是一個(gè)靈活而強(qiáng)大的工具路呜,它讓你可以跟蹤一個(gè)或多個(gè)進(jìn)程蝗肪,并檢查收集的數(shù)據(jù)词顾。 這樣,Instruments 可以幫你更好的理解應(yīng)用程序和操作系統(tǒng)的行為垃它。
(2)Instruments包括 Blank(空白)鲜屏、Activity Monitor(活動(dòng)監(jiān)視器)、Allocations(內(nèi)存分配)国拇、Cocoa Layout(頁(yè)面布局)洛史、Core Animation(核心動(dòng)畫(huà))、Core Data(數(shù)據(jù)庫(kù))酱吝、counters(計(jì)數(shù)器)也殖、Energy Log(電量輸出日志)、File Activity(文件活動(dòng))务热、Leaks(內(nèi)存泄漏)忆嗜、Metal System Trace(金屬系統(tǒng)跟蹤)、NetWork(網(wǎng)絡(luò)監(jiān)測(cè))崎岂、System Trace(系統(tǒng)跟蹤)捆毫、Time Profiler(時(shí)間分析)、Zombies(僵尸對(duì)象)等16個(gè)功能冲甘。
(3)官方使用指南地址:
二绩卤、Instruments啟動(dòng)方式
?(1)Xcode -> Open Developer Tool -> Instruments
(2)Product -> Profile
(3)長(zhǎng)按啟動(dòng)按鈕 -> Profile
三途样、Instruments使用
(1)Activity Monitor 活動(dòng)監(jiān)視器
(2)Allocations(內(nèi)存分配)
? ? ? ? 蘋(píng)果開(kāi)發(fā)文檔內(nèi)存分類(lèi):
? ? ? ? 1.Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the ? ? ? ? ? ?Leaks instrument).
? ? ? ? ?2.Abandoned memory: Memory still referenced by your application that has no useful purpose.
? ? ? ? ?3.Cached memory: Memory still referenced by your application that might be used again for better performance.
? ? ? ? 其中Leaked memory 和Abandoned memory 都屬于應(yīng)該釋放而沒(méi)釋放的內(nèi)存,都是內(nèi)存泄露濒憋。
(3)Cocoa Layout? 頁(yè)面布局
? ? ? ? 觀察NSLayoutConstraint對(duì)象的改變何暇,幫助我們判斷什么時(shí)間什么地點(diǎn)的constraint是否合理。
(4)Core Animation 核心動(dòng)畫(huà)
? ? ? ? ?檢測(cè)Core Animation 性能工具跋炕,主要針對(duì)GPU和CPU的使用進(jìn)行優(yōu)化赖晶。通常會(huì)把屏幕渲染工作交給GPU來(lái)處理;CPU主要負(fù) ? ? ? ?責(zé)運(yùn)算等方面的處理辐烂。(Core Animation does not support the iOS Simulator platform)
? ? ?根據(jù)WWDC的說(shuō)法遏插,當(dāng)在滑動(dòng)視圖時(shí),F(xiàn)PS低于45的時(shí)候纠修,用戶會(huì)感覺(jué)到滑動(dòng)有卡頓胳嘲。
? ? ? ?1. Color Blended Layers (圖層混合)
? ? ? ? ? ? 界面都是會(huì)出現(xiàn)多個(gè)UI控件疊加的情況,如果有透明或者半透明的控件扣草,那么GPU會(huì)去計(jì)算這些這些layer最終的顯示的顏色了牛。基于渲染程度對(duì)屏幕中混合區(qū)域進(jìn)行綠到紅的高亮顯示辰妙,越紅表示性能越差鹰祸,會(huì)對(duì)幀率等指標(biāo)造成較大影響。
? ? ? ? ? ? 優(yōu)化方法:設(shè)置opaque 屬性為true密浑;調(diào)整布局蛙婴,盡量不要疊加;給View設(shè)置一個(gè)不透明的顏色尔破,沒(méi)有特殊需要設(shè)置白色即可街图。
? ? ? ? 2. Color Hits Green and Misses Red(光柵化)
? ? ? ? ? ? 當(dāng)UIView.layer.shouldRasterize = YES 時(shí),在觸發(fā)離屏繪制的同時(shí)懒构,會(huì)將光柵化后的內(nèi)容緩存起來(lái)餐济,如果對(duì)應(yīng)的layer及其sublayers沒(méi)有發(fā)生改變,在下一幀的時(shí)候可以直接復(fù)用胆剧。這將在很大程度上提升渲染性能絮姆。
? ? ? ? 3. Color Copied Images(圖片顏色格式)
? ? ?蘋(píng)果的GPU只解析32bit的顏色格式,對(duì)于GPU不支持的色彩格式的圖片只能由CPU來(lái)處理赞赖,這樣的圖片為藍(lán)色滚朵,藍(lán)色越多性能越差。因?yàn)槿绻跐L動(dòng)加載大量圖片時(shí)前域,由CPU來(lái)處理圖片辕近,可能會(huì)阻塞主線程。
? ? ? ? 4. Color Non-Standard Surface Formats (標(biāo)記不標(biāo)準(zhǔn)的表面顏色格式)
? ? ? ? 5. Color Immediately(顏色刷新頻率)
? ? ? ? ? ?當(dāng)執(zhí)行顏色刷新的時(shí)候移除10ms的延遲匿垄,因?yàn)榭赡茉谔囟ㄇ闆r下你不需要這些延遲移宅,所以使用此選項(xiàng)加快顏色刷新的頻率归粉。不過(guò)一般這個(gè)調(diào)試選項(xiàng)我們是用不到的。
? ? ? ? 6. Color Misaligned Images(圖片大小)
? ? ? ? ? 這個(gè)選項(xiàng)可以幫助我們查看圖片大小是否正確顯示漏峰。如果image size和imageView size不匹配糠悼,image會(huì)出現(xiàn)黃色。要盡可能的減少黃色的出現(xiàn)浅乔,因?yàn)閕mage size與imageView size不匹配倔喂,會(huì)消耗資源壓縮圖片。
? ? ? ? ?7. Color Offscreen-Rendered Yellow(離屏渲染)
? ? ? ? ? ? 離屏渲染Off-Screen Rendering 指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開(kāi)辟一個(gè)緩沖區(qū)進(jìn)行渲染操作靖苇。還有另外一種屏幕渲染方式-當(dāng)前屏幕渲染On-Screen Rendering 席噩,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行。 離屏渲染會(huì)先在屏幕外創(chuàng)建新緩沖區(qū)贤壁,離屏渲染結(jié)束后悼枢,再?gòu)碾x屏切到當(dāng)前屏幕, 把離屏的渲染結(jié)果顯示到當(dāng)前屏幕上脾拆,這個(gè)上下文切換的過(guò)程是非常消耗性能的馒索,實(shí)際開(kāi)發(fā)中盡可能避免離屏渲染。
? ? ? ? ? 觸發(fā)離屏渲染Offscreen rendering的行為:
? ? ? ?(a)drawRect:方法
? ? ? ?(b)layer.shadow
? ? ? ?(c)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
? ? ? ?(d)layer.shouldRasterize
? ? ? ?(e)layer.mask
? ? ? ?(f)layer.masksToBounds && layer.cornerRadius
? ? ? ? ? ?這里有需要注意的是第三條layer.shouldRasterize 名船,其實(shí)就是我們本文講的第二個(gè)選項(xiàng)光柵化绰上,光柵化會(huì)觸發(fā)離屏渲染,因此光柵化慎用渠驼。第六條設(shè)置圓角會(huì)觸發(fā)離屏渲染渔期,如果在某個(gè)頁(yè)面大量使用了圓角,會(huì)非常消耗性能造成FPS急劇下降渴邦,設(shè)置圓角觸發(fā)離屏渲染要同時(shí)滿足下面兩個(gè)條件:layer.masksToBounds = YES;layer.cornerRadius = 5;
? ? ? ? 為了盡可能避免觸發(fā)離屏渲染,我們可以使用貝塞爾曲線設(shè)置圓角拘哨。
? ? ? ?8. Color Compositing Fast-Path Blue (快速路徑)
? ? ? ? ? ?標(biāo)記由硬件繪制的路徑為藍(lán)色谋梭,藍(lán)色越多越好,可以對(duì)直接使用OpenGL繪制的圖層進(jìn)行高亮倦青。
? ? ? ?9. Flash Updated Regions (重繪區(qū)域)
? ? ? ? ? ?這個(gè)選項(xiàng)會(huì)對(duì)重繪的內(nèi)容高亮成黃色,重繪就是指使用Core Graphics繪制瓮床,繪制會(huì)損耗一定的性能,因此重繪區(qū)域應(yīng)該越小越好产镐。
(5)Core Data(數(shù)據(jù)庫(kù))
? ? ? ? 主要是用于監(jiān)測(cè)讀取隘庄、緩存未命中、保存等操作癣亚,能直觀顯示是否保存次數(shù)遠(yuǎn)超實(shí)際需要丑掺。
(6)counters(計(jì)數(shù)器)
? ? ? ? 從用戶管理的點(diǎn)事件計(jì)數(shù)器儀器記錄信息。它可以記錄從一個(gè)過(guò)程或系統(tǒng)上運(yùn)行的所有進(jìn)程的信息述雾。需要真機(jī)測(cè)試
(7)Energy Diagnostic? 能量診斷
? ? ? ? ?用于Xcode下的Instruments來(lái)分析手機(jī)電量消耗的街州。(需要真機(jī)測(cè)試)
(8)File Activity? 文件活動(dòng)
? ? ? ? ?這個(gè)模板活動(dòng)監(jiān)視器文件和目錄,包括文件打開(kāi)或者關(guān)閉兼丰,文件權(quán)限修改,目錄創(chuàng)建唆缴,文件移動(dòng)等鳍征。不支持iOS 平臺(tái)。
(9)Leaks 內(nèi)存泄漏
? ? ? ? 查看內(nèi)存使用情況面徽,檢查泄漏內(nèi)存艳丛,并提供按類(lèi)別分配對(duì)象內(nèi)存地址以及內(nèi)存地址歷史分配記錄和泄漏塊的統(tǒng)計(jì)信息。
? ?1. Separate by Category 類(lèi)別分離
? ?2. Separate by Thread ?線程分離,只有這樣才能在調(diào)用路徑中能夠清晰看到占用CPU最大的線程.
? ?3. ?Invert Call Tree?從上到下跟蹤堆棧信息.這個(gè)選項(xiàng)可以快捷的看到方法調(diào)用路徑最深方法占用CPU耗時(shí),比如FuncA{FunB{FunC}},勾選后堆棧以C->B->A把調(diào)用層級(jí)最深的C顯示最外面.
? ?4. Hide System Libraries 隱藏系統(tǒng)調(diào)用庫(kù)
? ?5. Flatten Recursion ?處理遞歸(自己調(diào)用自己)趟紊,在每個(gè)棧中只跟蹤一個(gè)氮双,而不是多個(gè)。
(10)Metal System Trace(金屬系統(tǒng)跟蹤)
金屬系統(tǒng)跟蹤通過(guò)從應(yīng)用程序织阳,驅(qū)動(dòng)程序和gpu層提供跟蹤信息來(lái)描述ios和macos金屬應(yīng)用程序的性能眶蕉。
(11)Network 網(wǎng)絡(luò)監(jiān)測(cè)
分析應(yīng)用程序如何使用TCP / IP和UDP / IP連接使用連接儀器。
(12)System Trace? 系統(tǒng)跟蹤
? ? ? ? 該模板提供了系統(tǒng)行為的全面信息唧躲。它顯示線程何時(shí)調(diào)度造挽,并顯示從用戶到系統(tǒng)代碼的線程轉(zhuǎn)換,通過(guò)系統(tǒng)調(diào)用和內(nèi)存操作弄痹。這個(gè)模板可以在OS X操作系統(tǒng)和iOS上使用饭入。
(13)System Usage? 系統(tǒng)使用
? ? ? ? ?這個(gè)模板監(jiān)視一個(gè)應(yīng)用程序和記錄系統(tǒng)的I / O活動(dòng)相關(guān)的文件,套接字和共享內(nèi)存肛真。這包括輸入谐丢,輸出,時(shí)間回溯蚓让,調(diào)用樹(shù)乾忱,乃至每一次響應(yīng)。該模板只可用于iOS历极。
(14)Time Profiler? 時(shí)間分析器
? ? ? ? ?用來(lái)檢測(cè)app中每個(gè)方法所用的時(shí)間窄瘟,并且可以排序,并查找出哪些函數(shù)占用了大量時(shí)間趟卸。
(15)Zombies? 僵尸對(duì)象
? ? ? ? ?用來(lái)檢測(cè)過(guò)度釋放的“僵尸”對(duì)象蹄葱,還提供了數(shù)據(jù)對(duì)象分配的類(lèi)以及所有活動(dòng)分配內(nèi)存地址的歷史記錄。
? ? ? ? ?使用Zombies工具來(lái)查找僵尸對(duì)象: Zombies工具的查找原理其實(shí)和設(shè)置NSZombieEnabled環(huán)境變量的調(diào)試方法是一樣的锄列,啟動(dòng)Zombies后在內(nèi)部設(shè)置了NSZombieEnabled為true图云。
? ? ? ? ?啟用了NSZombieEnabled的話,它會(huì)用一個(gè)僵尸對(duì)象來(lái)代替已釋放對(duì)象邻邮。也就是在引用計(jì)數(shù)降到0時(shí)竣况,該僵尸實(shí)現(xiàn)會(huì)將該對(duì)象轉(zhuǎn)換成僵尸對(duì)象。僵尸對(duì)象的作用是在你向它發(fā)送消息時(shí)筒严,就不會(huì)向之前那樣Crash或者產(chǎn)生 一個(gè)難以理解的行為帕翻,而是放出一個(gè)錯(cuò)誤消息鸠补,它會(huì)顯示一段日志并自動(dòng)跳入調(diào)試器, 因此我們就可以找到具體或者大概是哪個(gè)對(duì)象被錯(cuò)誤的釋放了嘀掸。