Xcode Instruments是用于動(dòng)態(tài)調(diào)追蹤和分析OS X和iOS的代碼的性能分析和測試工具;
打開方式:
Xcode -> Open Developer Tool -> Instruments

其中比較常用的:
·Leaks:一般的查看內(nèi)存使用情況,檢查泄漏的內(nèi)存,并提供了所有活動(dòng)的分配和泄漏模塊的類對象分配統(tǒng)計(jì)·信息以及內(nèi)存地址歷史記錄
·Time Profiler:分析代碼的執(zhí)行時(shí)間,執(zhí)行對系統(tǒng)的CPU上運(yùn)行的進(jìn)程低負(fù)載時(shí)間為基礎(chǔ)采樣
其他的:
·Blank:創(chuàng)建一個(gè)空的模板,可以從Library庫中添加其他模板
·Allocations:用來檢查內(nèi)存分配,跟蹤過程的匿名虛擬內(nèi)存和堆的對象提供類名和可選保留/釋放歷史
·Activity Monitor:顯示器處理的CPU、內(nèi)存和網(wǎng)絡(luò)使用情況統(tǒng)計(jì)
·Automation:用JavaScript語言編寫,主要用于分析應(yīng)用的性能和用戶行為,模仿/擊發(fā)被請求的事件,利用它可以完成對被測應(yīng)用的簡單的UI測試及相關(guān)功能測試
·Cocoa Layout:觀察約束變化,找出布局代碼的問題所在。
·Core Animation:用來檢測Core Animation性能的,給我們提供了周期性的FPS,并且考慮到了發(fā)生在程序之外的動(dòng)畫,界面滑動(dòng)FPS可以進(jìn)行測試
·Core Data:監(jiān)測讀取、緩存未命中、保存等操作,能直觀顯示是否保存次數(shù)遠(yuǎn)超實(shí)際需要
·Energy Diagnostic :用于Xcode下的Instruments來分析手機(jī)電量消耗的。(必須是真機(jī)才有電量)
·GPU Driver :可以測量GPU的利用率,同樣也是一個(gè)很好的來判斷和GPU相關(guān)動(dòng)畫性能的指示器。它同樣也提供了類似Core Animtaion那樣顯示FPS的工具。
·Network:分析應(yīng)用程序如何使用TCP / IP和UDP / IP連接使用連接儀器。就是檢查手機(jī)網(wǎng)速的。(這個(gè)最好是真機(jī))
·Zombies:檢查是否訪問了僵尸對象
一、Leaks(泄漏)
1.內(nèi)存溢出和內(nèi)存泄漏的區(qū)別
內(nèi)存溢出 out of memory,是指程序在申請內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個(gè)integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出。
內(nèi)存泄露 memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會(huì)被占光。
memory leak會(huì)最終會(huì)導(dǎo)致out of memory!
在前面的ALLcations里面我們提到過內(nèi)存泄漏就是應(yīng)該釋放而沒有釋放的內(nèi)存。而內(nèi)存泄漏分為兩種:Leaked Memory 和 Abandoned Memory。前面我們講到了如何找到Abandoned Memory被遺忘的內(nèi)存,現(xiàn)在我們研究的就是Leaked Memory。
以發(fā)生的方式來分類,內(nèi)存泄漏可以分為4類:
1.常發(fā)性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。
2.偶發(fā)性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對檢測內(nèi)存泄漏至關(guān)重要。
3.一次性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄漏只會(huì)發(fā)生一次。
4.隱式內(nèi)存泄漏:程序在運(yùn)行過程中不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說這里并沒有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請的內(nèi)存。但是對于一個(gè)服務(wù)器程序,需要運(yùn)行幾天,幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。
也可以通過以下方式打開

有泄漏時(shí)長這樣

這樣設(shè)置

然后就可以通過雙擊到相對于的代碼中啦
二、Time Profiler(時(shí)間分析器)
檢測app中每個(gè)方法所用的時(shí)間,可以進(jìn)行排序、查找出占用了大量時(shí)間的函數(shù)。
使用Time Profile前有兩點(diǎn)需要注意的地方:
1、一定要使用真機(jī)調(diào)試
因?yàn)槟M器運(yùn)行在Mac上,Mac上的GPU和iOS設(shè)備的完全不一樣,模擬器不得已要在軟件層面(CPU)模擬設(shè)備的GPU,這意味著GPU相關(guān)的操作在模擬器上運(yùn)行的更慢,尤其是使用CAEAGLLayer來寫一些OpenGL的代碼時(shí)候,這就導(dǎo)致模擬器性能數(shù)據(jù)和用戶真機(jī)使用性能數(shù)據(jù)相去甚遠(yuǎn)。
2、應(yīng)用程序一定要使用發(fā)布配置
在發(fā)布環(huán)境打包的時(shí)候,編譯器會(huì)引入一系列提高性能的優(yōu)化,例如去掉調(diào)試符號或者移除并重新組織代碼。另iOS引入一種"Watch Dog"[看門狗]機(jī)制,不同的場景下,“看門狗”會(huì)監(jiān)測應(yīng)用的性能,如果超出了該場景所規(guī)定的運(yùn)行時(shí)間,“看門狗”就會(huì)強(qiáng)制終結(jié)這個(gè)應(yīng)用的進(jìn)程。開發(fā)者可以crashlog看到對應(yīng)的日志,但Xcode在調(diào)試配置下會(huì)禁用"Watch Dog"。
運(yùn)行你的程序,并打開 Time Profiler

里面便是一個(gè)個(gè)函數(shù)名,點(diǎn)擊便可進(jìn)入
