iOS性能測(cè)試實(shí)戰(zhàn)篇(一)

說(shuō)起性能調(diào)優(yōu)宛乃,感覺枯燥的語(yǔ)言不能引起大家對(duì)于性能調(diào)優(yōu)的重視征炼,所以舉個(gè)不太恰當(dāng)?shù)睦印?br> 曾經(jīng)有這么一家工廠,他們的產(chǎn)品從原材料到出廠一共需要經(jīng)過(guò)30條產(chǎn)品線眼坏。這家公司的老板對(duì)底下的員工曾多次強(qiáng)調(diào)過(guò)質(zhì)量的重要性宰译,員工們卻不以為然魄懂,他們覺得自己做的都很不錯(cuò)市栗。
有一次,老板去視察蛛淋,走到了一條產(chǎn)品線上褐荷,問(wèn)起工人嘹悼,這條產(chǎn)品線的合格率能達(dá)到多少,那個(gè)工人自豪的說(shuō)合溺,“98%”棠赛。老板卻并沒(méi)有十分滿意膛腐,搖著頭走開了。那位工人非常的疑惑辩涝。這么高的合格率勘天,老板為什么還是不滿意呢捉邢?于是這位工人就去向領(lǐng)導(dǎo)打聽伏伐,領(lǐng)導(dǎo)也不知道藐翎,于是后來(lái)這位工人直接找到了老板家里实幕,向老板請(qǐng)教昆庇。
老板很是詫異,于是就給這位工人簡(jiǎn)單科普了一下未舟,一條產(chǎn)品線的合格率是98%掂为,并不代表最后總的合格率是98%勇哗。應(yīng)該是這樣計(jì)算最后的合格率的:x=0.980.980.98...=0.545
所以欲诺,這家公司的生產(chǎn)線的合格率實(shí)際上只有54.5%渺鹦。
這個(gè)故事說(shuō)明的問(wèn)題其實(shí)很簡(jiǎn)單,我們開發(fā)的app的最終性能塞颁,都是由每一個(gè)細(xì)小的部分組合而成的祠锣,其中很多部分的內(nèi)容是進(jìn)行的乘法咽安,而不是加減,所以想要自己設(shè)計(jì)的app讓用戶用的爽澡腾,任何一個(gè)小的性能問(wèn)題我們都不能忽略。那么毅糟,iOS性能測(cè)試是什么留特?

** iOS性能測(cè)試是:**
l 資源消耗
l 內(nèi)存泄漏
l 流量消耗
l 耗電功率
l 渲染效果
l 加載時(shí)間
l 玛瘸。。右核。

** 性能調(diào)優(yōu)的方式:**
l 通過(guò)專門的性能調(diào)優(yōu)工具instruments
l 通過(guò)優(yōu)化代碼

** instruments的三種打開方式:**
l Open Developer Tool->instruments
l 右鍵點(diǎn)擊Xcode->Open Developer Tool->instruments
l 工具通過(guò)Xcode工具欄中Product->Profile可以啟動(dòng)
(1) Open Developer Tool->instruments


(2)右鍵點(diǎn)擊Xcode->Open Developer Tool->instruments



圖2

           (3)工具通過(guò)Xcode工具欄中Product->Profile可以啟動(dòng)

圖3

啟動(dòng)后界面如下:



圖4

性能工具按需求分類如下:

圖5
下面根據(jù)需求分類詳細(xì)介紹instruments。

時(shí)間

我們就啟動(dòng)耗時(shí)來(lái)分析躏鱼。
l Time profiler
CPU Usage估量時(shí)間
Call Tree計(jì)算時(shí)間
l NSLog

1.1啟動(dòng)耗時(shí)--Time profiler
1.1.1根據(jù)CPU Usage估量時(shí)間
l Profiler你的app染苛,手動(dòng)測(cè)量主到,點(diǎn)擊Record開始運(yùn)行


圖6
l 根據(jù)CPU峰值推拽估量時(shí)間

1.1.2根據(jù)Call Tree 去計(jì)算時(shí)間
l instruments -> Time Profiler
l Profiler你的app
l 切換到CPU strategy view登钥,找到你的app的啟動(dòng)的第一幀
剛開始我們拿到分析數(shù)據(jù)時(shí)往往是這樣的:


圖7

這里顯示的是執(zhí)行代碼完整路徑牧牢,其中系統(tǒng)和應(yīng)用本身一些調(diào)用路徑完全揉捏在一起。完全看不到我們關(guān)心的應(yīng)用程序中實(shí)際代碼執(zhí)行耗時(shí)和代碼路徑實(shí)際所在位置度陆。
怎么辦献幔?我們可以看到右側(cè)有一個(gè)“齒輪形狀”的設(shè)置按鈕。


圖8
Call Tree:
Separate By Thread:線程分離,只有這樣才能在調(diào)用路徑中能夠清晰看到占用CPU最大的線程蹬蚁;
Invert Call Tree:從上到下跟蹤堆棧信息.這個(gè)選項(xiàng)可以快捷的看到方法調(diào)用路徑最深方法占用CPU耗時(shí),比如FuncA{FunB{FunC}},勾選后堆棧以C->B->A把調(diào)用層級(jí)最深的C顯示最外面犀斋;
Hide System Libraries:這個(gè)就更有用了,勾選后耗時(shí)調(diào)用路徑只會(huì)顯示app耗時(shí)的代碼,性能分析普遍我們都比較關(guān)系自己代碼的耗時(shí)而不是系統(tǒng)的.基本是必選項(xiàng).注意有些代碼耗時(shí)也會(huì)納入系統(tǒng)層級(jí),可以進(jìn)行勾選前后前后對(duì)執(zhí)行路徑進(jìn)行比對(duì)會(huì)非常有用览效。
Top Functions:按耗時(shí)降序排列锤灿。

簡(jiǎn)單的方式可以快速勾選右邊Call Tree中Separate by Thread和Hide System Libraries兩個(gè)選項(xiàng)[后面會(huì)解釋選項(xiàng)作用]:



圖9-10

勾選Invert Call Tree:



圖11

勾選前后對(duì)比:



圖12


圖13
l 算出啟動(dòng)時(shí)間但校。

首次加載坐了如下操作:
A: 鏈接和載入:可以在Time Profile中顯示dyld載入庫(kù)函數(shù)状囱,庫(kù)會(huì)被映射到地址空間倘是,同時(shí)完成綁定以及靜態(tài)初始化。
B: UIKit初始化:如果應(yīng)用的Root View Controller是由XIB實(shí)現(xiàn)的奶栖,也會(huì)在啟動(dòng)時(shí)被初始化.
C: 應(yīng)用回調(diào):調(diào)用UIApplicationDeleagte的回調(diào):application:didFinishLaunchingWithOptions。
D: 第一次Core Animation調(diào)用:在啟動(dòng)后的方法-[UIApplication _resportAppLaunchFinished]中調(diào)用CA::Transaction::commit實(shí)現(xiàn)第一幀畫面的繪制袍镀。

應(yīng)用程序首次加載中啟動(dòng)方法willFinishLaunchingWithOptions和didFinishLaunchingWithOptions只做應(yīng)用程序首次啟動(dòng)必須的要操作,而針對(duì)_dyid_start在初始化庫(kù)framework函數(shù)的操作苇羡。不必要的Framework不要鏈接,避免首次加載耗時(shí)锦茁。

搜索-[UIApplication_reportAppLaunchFinished]的最后一幀叉存,即可算出啟動(dòng)時(shí)間。



圖14

Running Time列中顯示運(yùn)行每個(gè)方法所耗費(fèi)的時(shí)間稿存,根據(jù)耗時(shí)和占比猜測(cè)是否有代碼需要優(yōu)化。雙擊中間主窗口中的方法名進(jìn)入具體的代碼行查看率翅,耗時(shí)多的代碼行有顏色標(biāo)記袖迎,并顯示占比。

圖15

當(dāng)然對(duì)于開發(fā)而已辜贵,這種利用Time Profiler的方式計(jì)算啟動(dòng)耗時(shí)比較麻煩脯宿,他們更喜歡埋點(diǎn)。

1.2 啟動(dòng)耗時(shí)--NSLog
l 獲取某段代碼的執(zhí)行時(shí)間MKBlockTimer
l 利用類庫(kù)測(cè)試代碼的運(yùn)行時(shí)間MGBenchmark
評(píng)估總體運(yùn)行時(shí)間;
評(píng)估單步代碼的運(yùn)行時(shí)間;
找到所有代碼x最耗時(shí)的代碼;
找到代碼的平均運(yùn)行時(shí)間;
可以對(duì)不同的線程進(jìn)行評(píng)估(thread safe)
l 啟動(dòng)時(shí)間
看之前XXX的性能資料榴芳,是在AppDelegate里打點(diǎn)并不合理窟感。算出的只是main
調(diào)用AppDelegate文件的時(shí)間歉井。


圖16

圖17

所以是錯(cuò)誤的哩至。

業(yè)界對(duì)此的算法不同。貼吧是在內(nèi)存創(chuàng)建完成就算是啟動(dòng)成功卢佣,即:didLoad

個(gè)人覺得其實(shí)應(yīng)該是didAppear箭阶,即ui展示出來(lái)為準(zhǔn)。

埋點(diǎn)步驟:
在main.m中記當(dāng)前時(shí)間StartTime:



圖18

不能在ALATabBarController.h函數(shù)里面聲明嘹叫,會(huì)被多次調(diào)用罩扇,相當(dāng)于多次聲明全局變量怕磨;所以在ALATabBarController.m里面定義全局變量寞缝。



圖19

但是不可見荆陆,所以在ALATabBarController.h文件用extern集侯,將extern置于變量或者函數(shù)前棠枉,以表示變量或者函數(shù)的定義在別的文件中,即CFAbsoluteTime StartTime在ALATabBarController.m文件中聲明過(guò)命浴。

圖20

計(jì)算啟動(dòng)時(shí)間(didLoad):



圖21

計(jì)算啟動(dòng)時(shí)間(didAppear):



圖22

在log輸出窗口看準(zhǔn)確時(shí)間輸出:



圖23

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市月幌,隨后出現(xiàn)的幾起案子扯躺,更是在濱河造成了極大的恐慌,老刑警劉巖倍啥,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎埠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弟塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門拙已,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人系宫,你說(shuō)我怎么就攤上這事〗凡遥” “怎么了潮罪?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沃暗。 經(jīng)常有香客問(wèn)我孽锥,道長(zhǎng),這世上最難降的妖魔是什么惜辑? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任韵丑,我火速辦了婚禮虚缎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陌僵。我一直安慰自己创坞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布偎谁。 她就那樣靜靜地躺著巡雨,像睡著了一般席函。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上正蛙,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天乒验,我揣著相機(jī)與錄音,去河邊找鬼奸攻。 笑死虱痕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的部翘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窖梁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纵刘!你這毒婦竟也來(lái)了荸哟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舵抹,失蹤者是張志新(化名)和其女友劉穎劣砍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體香嗓,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靠娱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年饱岸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苫费。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡百框,死狀恐怖牍汹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫁蛇,我是刑警寧澤露该,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站解幼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏底靠。R本人自食惡果不足惜特铝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一苟呐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧严衬,春花似錦、人聲如沸笆呆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榕堰。三九已至嫌套,卻和暖如春踱讨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痹筛。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工帚稠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留床佳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓砌们,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親角溃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篮撑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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