性能監(jiān)控:Xcode 自帶 Instruments工具

目錄

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 的代碼如下所示:

Instruments 的各種性能檢測(cè)工具

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)控。

計(jì)算CPU使用率


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)代碼如下:

FPS 線上監(jiā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)的代碼如下:

內(nèi)存信息結(jié)構(gòu)

OK牵舵,類似于對(duì) CPU 使用率的監(jiān)控,我們只要從這個(gè)結(jié)構(gòu)體里取出 phys_footprint 字段的值倦挂,就能夠監(jiān)控到實(shí)際物理內(nèi)存的使用情況了畸颅。具體實(shí)現(xiàn)代碼如下:

使用內(nèi)存計(jì)算方法

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ā)了拳话。如下圖所示。

項(xiàng)目中添加該擴(kuò)展

經(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)控工具的原因。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晦嵌,一起剝皮案震驚了整個(gè)濱河市同辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惭载,老刑警劉巖旱函,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異描滔,居然都是意外死亡棒妨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門含长,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)券腔,“玉大人,你說(shuō)我怎么就攤上這事拘泞》兹遥” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵陪腌,是天一觀的道長(zhǎng)辱魁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)偷厦,這世上最難降的妖魔是什么商叹? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮只泼,結(jié)果婚禮上剖笙,老公的妹妹穿的比我還像新娘。我一直安慰自己请唱,他們只是感情好弥咪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著十绑,像睡著了一般聚至。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上本橙,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天扳躬,我揣著相機(jī)與錄音,去河邊找鬼。 笑死贷币,一個(gè)胖子當(dāng)著我的面吹牛击胜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播役纹,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偶摔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了促脉?” 一聲冷哼從身側(cè)響起辰斋,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘸味,沒(méi)想到半個(gè)月后宫仗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旁仿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锰什,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁逝。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汁胆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霜幼,到底是詐尸還是另有隱情嫩码,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布罪既,位于F島的核電站铸题,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琢感。R本人自食惡果不足惜丢间,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驹针。 院中可真熱鬧烘挫,春花似錦、人聲如沸柬甥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苛蒲。三九已至卤橄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臂外,已是汗流浹背窟扑。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工喇颁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嚎货。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓无牵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親厂抖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容