目錄
1、Instruments功能
2梨撞、線上性能監(jiān)控
? ? ? ? ? ? 2-1雹洗、CPU 使用率的線上監(jiān)控方法 ??
? ? ? ? ? ? 2-2、FPS 線上監(jiān)控方法
? ? ? ? ? ? 2-3卧波、內(nèi)存使用量的線上監(jiān)控方法
3时肿、開(kāi)發(fā)一款自定義 Instruments 工具
4、總結(jié):
1港粱、Instruments功能 :為了能夠主動(dòng)螃成、高效地發(fā)現(xiàn)性能問(wèn)題,避免 App 質(zhì)量進(jìn)入無(wú)人監(jiān)管的失控狀態(tài)查坪,我們就需要對(duì) App 的性能進(jìn)行監(jiān)控寸宏。目前,對(duì) App 的性能監(jiān)控偿曙,主要是從線下和線上兩個(gè)維度展開(kāi)氮凝。
1、最新版本的 Instruments 10 還有以下兩大優(yōu)勢(shì):Instruments 基于 os_signpost 架構(gòu)望忆,可以支持所有平臺(tái)覆醇。Instruments 由于標(biāo)準(zhǔn)界面(Standard UI)和分析核心(Analysis Core)技術(shù)朵纷,使得我們可以非常方便地進(jìn)行自定義性能監(jiān)測(cè)工具的開(kāi)發(fā)。當(dāng)你想要給 Instruments 內(nèi)置的工具換個(gè)交互界面永脓,或者新創(chuàng)建一個(gè)工具的時(shí)候袍辞,都可以通過(guò)自定義工具這個(gè)功能來(lái)實(shí)現(xiàn)。
2常摧、蘋果公司在 WWDC 2018 Session 410 鏈接?Creating Custom Instruments 里提供了一個(gè)范例:通過(guò) os_signpost API 將圖片下載的數(shù)據(jù)提供給 Analysis Core 進(jìn)行監(jiān)控觀察搅吁。這個(gè)示例在 App 的代碼如下所示:
2、線上性能監(jiān)控
1落午、監(jiān)控代碼不要侵入到業(yè)務(wù)代碼中谎懦;
2、采用性能消耗最小的監(jiān)控方案溃斋。
線上性能監(jiān)控界拦,主要集中在 【CPU 使用率、FPS 的幀率 和 內(nèi)存】?這三個(gè)方面梗劫。接下來(lái)享甸,我們就分別從這三個(gè)方面展開(kāi)討論吧。
2-1梳侨、CPU 使用率的線上監(jiān)控方法 ? App 作為進(jìn)程運(yùn)行起來(lái)后會(huì)有多個(gè)線程蛉威,每個(gè)線程對(duì) CPU 的使用率不同。各個(gè)線程對(duì) CPU 使用率的總和走哺,就是當(dāng)前 App 對(duì) CPU 的使用率蚯嫌。明白了這一點(diǎn)以后,我們也就摸清楚了對(duì) CPU 使用率進(jìn)行線上監(jiān)控的思路丙躏。
在 iOS 系統(tǒng)中择示,你可以在 usr/include/mach/thread_info.h 里看到線程基本信息的結(jié)構(gòu)體,其中的 cpu_usage 就是 CPU 使用率晒旅。結(jié)構(gòu)體的完整代碼如下所示:
因?yàn)槊總€(gè)線程都會(huì)有這個(gè) thread_basic_info 結(jié)構(gòu)體栅盲,所以接下來(lái)的事情就好辦了,你只需要定時(shí)(比如敢朱,將定時(shí)間隔設(shè)置為 2s)去遍歷每個(gè)線程,累加每個(gè)線程的 cpu_usage 字段的值摩瞎,就能夠得到當(dāng)前 App 所在進(jìn)程的 CPU 使用率了拴签。實(shí)現(xiàn)代碼如下:
在下面這段代碼中,task_threads 方法能夠取到當(dāng)前進(jìn)程中的線程總數(shù) threadCount 和所有線程的數(shù)組 threads旗们。
接下來(lái)蚓哩,我們就可以通過(guò)遍歷這個(gè)數(shù)組來(lái)獲取單個(gè)線程的基本信息。其中上渴,線程基本信息的結(jié)構(gòu)體是 thread_basic_info_t岸梨,這個(gè)結(jié)構(gòu)體里就包含了我們需要的 CPU 使用率的字段 cpu_usage喜颁。
然后,我們累加這個(gè)字段就能夠獲取到當(dāng)前的整體 CPU 使用率曹阔。到此半开,我們就實(shí)現(xiàn)了對(duì) CPU 使用率的線上監(jiān)控。
2-2赃份、FPS 線上監(jiān)控方法
FPS 是指圖像連續(xù)在顯示設(shè)備上出現(xiàn)的頻率寂拆。FPS 低,表示 App 不夠流暢抓韩,還需要進(jìn)行優(yōu)化纠永。但是,和前面對(duì) CPU 使用率和內(nèi)存使用量的監(jiān)控不同谒拴,iOS 系統(tǒng)中沒(méi)有一個(gè)專門的結(jié)構(gòu)體尝江,用來(lái)記錄與 FPS 相關(guān)的數(shù)據(jù)。但是英上,對(duì) FPS 的監(jiān)控也可以比較簡(jiǎn)單的實(shí)現(xiàn):通過(guò)注冊(cè) CADisplayLink 得到屏幕的同步刷新率炭序,記錄每次刷新時(shí)間,然后就可以得到 FPS善延。具體的實(shí)現(xiàn)代碼如下:
2-3少态、內(nèi)存使用量的線上監(jiān)控方法
通常情況下,我們?cè)讷@取 iOS 應(yīng)用內(nèi)存使用量時(shí)易遣,都是使用 task_basic_info 里的 resident_size 字段信息彼妻。但是,我們發(fā)現(xiàn)這樣獲得的內(nèi)存使用量和 Instruments 里看到的相差很大豆茫。后來(lái)侨歉,在 2018 WWDC Session 416 iOS Memory Deep Dive 鏈接?中,蘋果公司介紹說(shuō) phys_footprint 才是實(shí)際使用的物理內(nèi)存揩魂。
內(nèi)存信息存在 task_info.h (完整路徑 usr/include/mach/task.info.h)文件的 task_vm_info 結(jié)構(gòu)體中幽邓,其中 phys_footprint 就是物理內(nèi)存的使用,而不是駐留內(nèi)存 resident_size火脉。結(jié)構(gòu)體里和內(nèi)存相關(guān)的代碼如下:
OK牵舵,類似于對(duì) CPU 使用率的監(jiān)控,我們只要從這個(gè)結(jié)構(gòu)體里取出 phys_footprint 字段的值倦挂,就能夠監(jiān)控到實(shí)際物理內(nèi)存的使用情況了畸颅。具體實(shí)現(xiàn)代碼如下:
3、開(kāi)發(fā)一款自定義 Instruments 工具
主要包括以下這幾個(gè)步驟:
1> 在 Xcode 中方援,點(diǎn)擊 File > New > Project没炒;
2> 在彈出的 Project 模板選擇界面,將其設(shè)置為 macOS犯戏;
3>選擇 Instruments Package送火,點(diǎn)擊后即可開(kāi)始自定義工具的開(kāi)發(fā)了拳话。如下圖所示。
經(jīng)過(guò)上面的三步之后种吸,會(huì)在新創(chuàng)建的工程里面生成一個(gè).instrpkg 文件弃衍,接下來(lái)的開(kāi)發(fā)過(guò)程主要就是對(duì)這個(gè)文件的配置工作了。這些配置工作中最主要的是要完成 Standard UI 和 Analysis Core 的配置骨稿。
上面這些內(nèi)容笨鸡,就是你在開(kāi)發(fā)一個(gè)自定義 Instruments 工具時(shí),需要完成的編碼工作了坦冠⌒魏模可以看到,Instruments 10 版本的自定義工具開(kāi)發(fā)還是比較簡(jiǎn)單的辙浑。與此同時(shí)激涤,蘋果公司還提供了大量的代碼片段,幫助你進(jìn)行個(gè)性化的配置判呕。你可以點(diǎn)擊這個(gè)鏈接倦踢,查看官方指南中的詳細(xì)教程。
Analysis Core 收集和處理數(shù)據(jù)的過(guò)程侠草,可以大致分為以下這三步:
1>處理我們配置好的各種數(shù)據(jù)表辱挥,并申請(qǐng)存儲(chǔ)空間 store;
2> store 去找數(shù)據(jù)提供者边涕,如果不能直接找到晤碘,就會(huì)通過(guò) Modeler 接收其他 store 的輸入信號(hào)進(jìn)行合成;
3> store 獲得數(shù)據(jù)源后功蜓,會(huì)進(jìn)行 Binding Solution 工作來(lái)優(yōu)化數(shù)據(jù)處理過(guò)程园爷。
這里需要強(qiáng)調(diào)的是,在我們通過(guò) store 找到的這些數(shù)據(jù)提供者中式撼,對(duì)開(kāi)發(fā)者來(lái)說(shuō)最重要的就是 os_signpost童社。os_signpost 的主要作用,是讓你可以在程序中通過(guò)編寫代碼來(lái)獲取數(shù)據(jù)著隆。你可以在工程中的任何地方通過(guò) os_signpost API 扰楼,將需要的數(shù)據(jù)提供給 Analysis Core。
蘋果公司在 WWDC 2018 Session 410 Creating Custom Instruments 鏈接?里提供了一個(gè)范例:通過(guò) os_signpost API 將圖片下載的數(shù)據(jù)提供給 Analysis Core 進(jìn)行監(jiān)控觀察美浦。這個(gè)示例在 App 的代碼如下所示:需要注意的是弦赖,上面代碼中,os_signpost 的 begin 和 end 需要成對(duì)出現(xiàn)抵代。
4腾节、總結(jié):
作為一名 iOS 開(kāi)發(fā)者忘嫉,與其一起開(kāi)始到處去尋找各種解決方案荤牍,不如先摸透蘋果公司自己的庫(kù)和工具案腺,這里面的設(shè)計(jì)思想和演進(jìn)包含有大量可以吸取和學(xué)習(xí)的知識(shí)。掌握好了這些知識(shí)康吵,你也就能夠開(kāi)發(fā)出適合自己團(tuán)隊(duì)的工具了劈榨。所以沒(méi)有在這篇文章中和你介紹第三方線上性能監(jiān)控工具的原因。