iOS 性能優(yōu)化 - TimeProfiler分析代碼耗時

一: Time Profiler

Time Profiler用來分析代碼的執(zhí)行時間,主要用來分析CPU使用情況。
注意:要在release模式(或者自定義的其他的打包模式)下分析,原因在release模式下:

    1. 會開啟編譯器優(yōu)化,提高代碼運行效率
    1. 生成調(diào)試的符號表,這樣才能夠在profile的時候看到代碼的調(diào)用棧
    1. 多數(shù)條件編譯只會在debug模式下生效桑驱,release模式和生產(chǎn)環(huán)境是一樣的。

二: 原理

Time Profiler每隔1ms會對線程的調(diào)用棧采樣跛蛋,然后用統(tǒng)計學(xué)的方式去做出分析熬的。

image

圖中虛線是采樣點,最后統(tǒng)計出調(diào)用棧和對應(yīng)函數(shù)出現(xiàn)的個數(shù)赊级。

從圖中不難看出押框,method3并沒有出現(xiàn)在統(tǒng)計結(jié)果中,也就意味著方法運行的足夠快的時候理逊,很有可能統(tǒng)計不到橡伞,但這對于分析來說并不會有太大影響,因為運行快的方法往往不會引起性能問題挡鞍。

Tips:Time Profiler并不會精確的統(tǒng)計出方法的執(zhí)行時間,當(dāng)線程處于掛起和等待執(zhí)行的狀態(tài)時候预烙,timer profiler并不能統(tǒng)計到墨微,它只能統(tǒng)計到真正在CPU上執(zhí)行的。

三: Demo

Demo工程是一個簡易的相冊應(yīng)用扁掸,故意寫的很爛翘县,包含了三個界面:

? 第一個界面只提供一個入口

? main界面用瀑布流的方式提供圖片預(yù)覽,圖片被加了濾鏡

? detail界面可以查看大圖

image
image
image

在iPhone 6上運行谴分,在進入main界面的時候會看到明顯的卡頓:


image

我們通過Time Profile來找到原因:Product -> Profile

這會讓XCode執(zhí)行一次Release的build锈麸,然后啟動Instrument

image

我們選擇Time Profiler啟動,然后正常操作App牺蹄,采集到了數(shù)據(jù)后忘伞,停止Instrument。

image

對圖中的幾點說明:

  • 各個線程的采集數(shù)據(jù)匯總
  • 點擊1中的某一行,可以看到采集到的堆棧氓奈,注意2區(qū)域的右上角翘魄,可以選擇隱藏系統(tǒng)的符號
  • 可以選擇關(guān)注的隊列/CPU等。
  • 可以用pinch手勢來放大縮小時間范圍舀奶,鼠標(biāo)可以拖動選擇一段區(qū)域

Tips:
Weight表示占用全部的百分比
Self Wight表示當(dāng)前方法執(zhí)行占用的百分比暑竟,如果看到是0,表示當(dāng)前方法其實不占用什么時間育勺,時間都是子程序調(diào)用占用的但荤。

我們用鼠標(biāo)拖動,選擇選擇CPU占用較高的部分涧至,可以看到堆棧如下:

image

Tips: 按住Option腹躁,然后鼠標(biāo)左鍵點圖中的箭頭,可以快速展開化借。

從圖中看到:大部分時間占用在-[MainController loadAllImages]這個方法:讀取本地圖片潜慎,然后對圖加濾鏡

- (void)loadAllImages{
    NSMutableArray * images = [NSMutableArray new];
    for (long i = 1; i < 40; i++) {
        NSString * imageName = [NSString stringWithFormat:@"image_%ld",i % 20 + 1];
        NSString * imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"jpeg"];
        UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
        [images addObject:[self filterdImage:image]];
    }
    self.images = [images copy];
}

我們可以勾選以下選項,來看得更清楚一些:

  • Hide System Libraries 隱藏系統(tǒng)的庫
  • Invert Call Tree 倒置函數(shù)隊?wèi)?zhàn)
image

勾選后

image

Timer Profiler的基本debug邏輯:分析 -> 找到最大的占用函數(shù) -> 修復(fù) -> 繼續(xù)分析…蓖康,直到完全修復(fù)铐炫。有時候自己的代碼會引起系統(tǒng)代碼卡頓,所以查看系統(tǒng)庫的卡頓也很有必要的蒜焊。

可以通過雙擊一行倒信,進入源代碼界面,看看具體某一行的占用情況:


image

也可以選擇查看次數(shù):


image

查看次數(shù):

image

或者泳梆,查看反匯編

image

四: FAQ

為什么我在Time Profiler看不到類和方法的名稱呢鳖悠?

絕大部分原因是你的打包模式?jīng)]有開啟dSYM或者debug symbols

image
為什么明明我的App很卡,可是用Time Profiler分析卻找不到相關(guān)代碼优妙?

卡頓的原因主要分為兩大類:CPU瓶頸和GPU瓶頸

當(dāng)界面有大量的shadow乘综,mask或者有非常多的View/Layer,GPU渲染紋理和頂點的時候可能會有壓力套硼,這時候應(yīng)該用Core Animation觀察GPU的使用率卡辰。

CPU引起的卡頓大多可以通過Time Profiler找到,如果找不到可能的原因有兩個:

  • 代碼引起了大量系統(tǒng)調(diào)用邪意,占用CPU時間九妈,這種情況你需要仔細(xì)分析Time Profiler中的系統(tǒng)占用。
  • 頻繁的鎖和線程切換雾鬼。因為線程被掛起的時候萌朱,time profiler無法采樣到,這種情況可以通過System Trace分析策菜。

摘自:黃文臣博客-TimeProfiler分析代碼耗時
TimeProfilerdemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晶疼,一起剝皮案震驚了整個濱河市酒贬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冒晰,老刑警劉巖同衣,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壶运,居然都是意外死亡耐齐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門蒋情,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埠况,“玉大人,你說我怎么就攤上這事棵癣≡玻” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵狈谊,是天一觀的道長喜命。 經(jīng)常有香客問我,道長河劝,這世上最難降的妖魔是什么壁榕? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮赎瞎,結(jié)果婚禮上牌里,老公的妹妹穿的比我還像新娘。我一直安慰自己务甥,他們只是感情好牡辽,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敞临,像睡著了一般态辛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挺尿,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天奏黑,我揣著相機與錄音,去河邊找鬼票髓。 笑死攀涵,一個胖子當(dāng)著我的面吹牛铣耘,可吹牛的內(nèi)容都是我干的洽沟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蜗细,長吁一口氣:“原來是場噩夢啊……” “哼裆操!你這毒婦竟也來了怒详?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤踪区,失蹤者是張志新(化名)和其女友劉穎昆烁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缎岗,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡静尼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了传泊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼠渺。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖眷细,靈堂內(nèi)的尸體忽然破棺而出拦盹,到底是詐尸還是另有隱情,我是刑警寧澤溪椎,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布普舆,位于F島的核電站,受9級特大地震影響校读,放射性物質(zhì)發(fā)生泄漏沼侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一地熄、第九天 我趴在偏房一處隱蔽的房頂上張望华临。 院中可真熱鬧,春花似錦端考、人聲如沸雅潭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶供。三九已至,卻和暖如春裂明,著一層夾襖步出監(jiān)牢的瞬間椿浓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工闽晦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扳碍,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓仙蛉,卻偏偏與公主長得像笋敞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荠瘪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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