Instruments 簡介
Instruments 是 Xcode 的一個工具集匹表,為我們提供了強(qiáng)大的程序性能分析及測試能力访雪。使用 Instruments 你可以做下面這些事:
檢查一個或多個應(yīng)用或進(jìn)程的行為。
檢查設(shè)備相關(guān)的功能持灰,比如:Wi-Fi湿蛔、藍(lán)牙等。
在真機(jī)或模擬器上進(jìn)行性能測試酒唉。
創(chuàng)建自定義的 DTrace 來分析系統(tǒng)以及應(yīng)用的各種行為。
跟蹤源碼中的問題沸移。
對 App 進(jìn)行性能分析痪伦。
查找 App 中的內(nèi)存問題,比如:內(nèi)存泄露(Leaked memory)雹锣、廢棄內(nèi)存(Abandoned memory)网沾、僵尸(zombies)等。
給出程序優(yōu)化的建議蕊爵。
進(jìn)行系統(tǒng)級別的問題定位绅这。
通過腳本記錄一個用戶行為序列,從而可以通過運(yùn)行腳本對你的 iOS 應(yīng)用進(jìn)行可重復(fù)多次的自動化測試在辆。
保存測試配置模板以供復(fù)用。
可以看到 Instruments 功能很多度苔,這里先介紹一下我們在開發(fā)中常用到的幾種:CPU 性能測試匆篓、圖形性能測試、內(nèi)存性能測試寇窑。
雖然 Instruments 是 Xcode 的一個工具集鸦概,但是它是以一個獨(dú)立的 App 的形式存在的,你可以在 Xcode -> Open Developer Tool -> Instruments
中打開它。
CPU 性能
要看程序執(zhí)行時間性能窗市,主要有下面幾步:
1先慷、先在 Xcode 中對當(dāng)前的項目做 Profile (Command-I):
這時就會打開 Profiling Template 選項對話框:
2、選擇 Time Profiler
這個模板咨察,并點(diǎn)擊 Choose
按鈕论熙。
3、進(jìn)入 Instruments 后摄狱,選擇正確的設(shè)備和應(yīng)用程序:
4脓诡、點(diǎn)擊紅色按鈕運(yùn)行后,就能得到 CPU 性能的結(jié)果了:
我們還能在時間軸面板里面去選擇一段時間來查看該時間段里更為細(xì)節(jié)的 CPU 性能:
同時在中間的導(dǎo)航條以及右下角的控制面板中媒役,我們還可以通過不同的選項來選擇數(shù)據(jù)展示的形式和維度祝谚。
從這個結(jié)果中,我們可以看到不同的線程以及方法調(diào)用占用的時間酣衷,從而可以評估出 CPU 性能的瓶頸和優(yōu)化方向交惯。
5、除此之外穿仪,我們還能在 Instruments 選擇使用 Counters
席爽、Activity Monitor
、System Trace
等 Profiling Template 對程序做 CPU 性能考量牡借。
圖形性能
關(guān)于圖形性能方面拳昌,我們平時最關(guān)注的應(yīng)該就是「幀率」這個概念了。在 Instruments 中钠龙,我們可以使用 Core Animation
- Time Profiler
來評估圖形性能炬藤。使用步驟如下:
1、同「CPU 占用性能測試」一樣碴里,先在 Xcode 中對當(dāng)前的項目執(zhí)行 Profile (Command-I)沈矿,并在打開的對話框中選擇 Core Animaiton
這個模板:
2、進(jìn)入 Instruments 后咬腋,選擇正確的設(shè)備和應(yīng)用程序羹膳。
3、點(diǎn)擊紅色按鈕運(yùn)行應(yīng)用程序根竿,隨著我們操作 App 界面陵像,就可以看到幀率的變化和數(shù)據(jù)了:
在滑動屏幕時,幀率越高表示性能越好寇壳,幀率過低則意味著屏幕可能會出現(xiàn)卡頓醒颖。
4、在右下角面板的 Display Settings 區(qū)域壳炎,我們可以看到多個 Debug Options:
Color Blended Layers
泞歉,這個選項選項基于渲染程度對屏幕中的混合區(qū)域進(jìn)行綠到紅的高亮顯示,越紅表示性能越差,會對幀率等指標(biāo)造成較大的影響腰耙。紅色通常是由于多個半透明圖層疊加引起榛丢。
Color Hits Green and Misses Red
,當(dāng) UIView.layer.shouldRasterize = YES
時挺庞,耗時的圖片繪制會被緩存晰赞,并當(dāng)做一個簡單的扁平圖片來呈現(xiàn)。這時候挠阁,如果頁面的其他區(qū)塊(比如 UITableViewCell 的復(fù)用)使用緩存直接命中宾肺,就顯示綠色,反之侵俗,如果不命中锨用,這時就顯示紅色。紅色越多隘谣,性能越差增拥。因為柵格化生成緩存的過程是有開銷的,如果緩存能被大量命中和有效使用寻歧,則總體上會降低開銷掌栅,反之則意味著要頻繁生成新的緩存,這會讓性能問題雪上加霜码泛。
Color Copied Images
猾封,對于 GPU 不支持的色彩格式的圖片只能由 CPU 來處理,把這樣的圖片標(biāo)為藍(lán)色噪珊。藍(lán)色越多晌缘,性能越差。因為痢站,我們不希望在滾動視圖的時候磷箕,由 CPU 來處理圖片,這樣可能會對主線程造成阻塞阵难。
Color Immediately
岳枷,通常 Core Animation Instruments 以每毫秒 10 次的頻率更新圖層調(diào)試顏色。對某些效果來說呜叫,這顯然太慢了空繁。這個選項就可以用來設(shè)置每幀都更新(可能會影響到渲染性能,而且會導(dǎo)致幀率測量不準(zhǔn)朱庆,所以不要一直都設(shè)置它)盛泡。
Color Misaligned Images
,這個選項檢查了圖片是否被縮放椎工,以及像素是否對齊。被放縮的圖片會被標(biāo)記為黃色,像素不對齊則會標(biāo)注為紫色维蒙。黃色掰吕、紫色越多,性能越差颅痊。
Color Offscreen-Rendered Yellow
殖熟,這個選項會把那些離屏渲染的圖層顯示為黃色。黃色越多斑响,性能越差菱属。這些顯示為黃色的圖層很可能需要用 shadowPath 或者 shouldRasterize 來優(yōu)化。
Color OpenGL Fast Path Blue
舰罚,這個選項會把任何直接使用 OpenGL 繪制的圖層顯示為藍(lán)色纽门。藍(lán)色越多,性能越好营罢。如果僅僅使用 UIKit 或者 Core Animation 的 API赏陵,那么不會有任何效果。如果使用 GLKView 或者 CAEAGLLayer饲漾,那如果不顯示藍(lán)色塊的話就意味著你正在強(qiáng)制 CPU 渲染額外的紋理蝙搔,而不是繪制到屏幕。
Flash Updated Regions
考传,這個選項會把重繪的內(nèi)容顯示為黃色吃型。不該出現(xiàn)的黃色越多,性能越差僚楞。通常我們希望只是更新的部分被標(biāo)記完黃色勤晚。
我們可以使用這些選項,來監(jiān)測更加具體的圖形性能镜硕。
5运翼、我們還可以選擇使用 OpenGL ES Analysis
、GPU Driver
等模板來監(jiān)測圖形相關(guān)性能兴枯。
內(nèi)存性能
Instruments 可以幫我們了解到應(yīng)用程序使用內(nèi)存的幾個方面:
全局內(nèi)存使用情況(Overall Memory Use)
: 從全局的角度監(jiān)測應(yīng)用程序的內(nèi)存使用情況血淌,捕捉非預(yù)期的或大幅度的內(nèi)存增長。
內(nèi)存泄露(Leaked memory)
: 未被你的程序引用财剖,同時也不能被使用或釋放的內(nèi)存悠夯。
廢棄內(nèi)存(Abandoned memory)
: 被你的程序引用,但是沒什么卵用的內(nèi)存躺坟。
僵尸對象(Zombies)
: 僵尸對象指的是對應(yīng)的內(nèi)存已經(jīng)被釋放并且不再會使用到沦补,但是你的程序卻在某處依然有指向它的引用。在 iOS 中有一個 NSZombie 機(jī)制咪橙,這個是為了內(nèi)存調(diào)試的目的而設(shè)計的一種機(jī)制夕膀。在這個機(jī)制下虚倒,當(dāng)你 NSZombieEnabled 為 YES 時,當(dāng)一個對應(yīng)的引用計數(shù)減為 0 時产舞,這個對象不會被釋放魂奥,當(dāng)這個對象再收到任何消息時,它會記錄一條 warning易猫,而不是直接崩潰耻煤,以方便我們進(jìn)行程序調(diào)試。
這里我們介紹下查找內(nèi)存泄露的過程:
1准颓、同「CPU 占用性能測試」一樣哈蝇,先在 Xcode 中對當(dāng)前的項目執(zhí)行 Profile (Command-I),并在打開的對話框中選擇 Leaks
這個模板:
2攘已、進(jìn)入 Instruments 后炮赦,選擇正確的設(shè)備和應(yīng)用程序。
3贯被、點(diǎn)擊紅色按鈕運(yùn)行應(yīng)用程序眼五,我們可以看到如下界面:
4、在 Display Settings 中勾選 Invert Call Tree
和 Hide System Libraries
或其他選項可以過濾顯示的數(shù)據(jù)彤灶。
[圖片上傳中看幼。。幌陕。(13)]
5诵姜、在導(dǎo)航欄的篩選框中,我們可以輸入關(guān)鍵字來篩選數(shù)據(jù)搏熄。
6棚唆、在實際使用中,我們進(jìn)入一個頁面后再退出心例,發(fā)現(xiàn)相關(guān)的內(nèi)存分配沒有清空宵凌,這時候就發(fā)生內(nèi)存泄露了。我們查看更細(xì)節(jié)的調(diào)用信息止后,追蹤到可能造成內(nèi)存泄露的代碼位置:
7瞎惫、我們還可以使用 Activity Monitor
、Allocations
译株、Zombies
等模板來針對性地做內(nèi)存監(jiān)測瓜喇。