移動APP啟動效率治理之道

隨著互聯(lián)網(wǎng)快速發(fā)展腥光,移動互聯(lián)網(wǎng)也跟著快速的發(fā)展起來懒构,導致出現(xiàn)了很多各種各樣的APP众羡,很多主流的APP也培養(yǎng)了用戶的某些用戶習慣,用戶也越來越注重APP用戶體驗嗦嗡,APP加載慢就是其中讓用戶很頭疼體驗很差的一樣問題勋锤,那么APP加載慢一般是由什么原因?qū)е碌模?/p>

APP加載慢一般可以從這幾個方面去了解

一、APP啟動加載慢

APP啟動大體分為三個步驟侥祭,可執(zhí)行文件加載叁执、mian()函數(shù)執(zhí)行后、首屏渲染完成后

1矮冬、可執(zhí)行文件加載

iOS加載APP的一些 .O文件谈宛,

加載動態(tài)鏈接庫,

指針調(diào)整胎署,bind符號的綁定吆录,

運行時初始化處理,(初始化琼牧,包括了執(zhí)行 +load() 方法恢筝、attribute((constructor)) 修飾的函數(shù)的調(diào)用、創(chuàng)建)

項目里各相關(guān)類的注冊巨坊,category 注冊撬槽,

檢查各類的唯一性

那在執(zhí)行這些程序的時候怎么導致加載慢呢?

1趾撵、如果是動態(tài)庫特別多的話侄柔,就會導致加載慢,所以我們盡量減少動態(tài)庫的加載占调,蘋果建議如果加載時動態(tài)庫較多的話勋拟,可以把動態(tài)庫合并使用,蘋果允許最多6個非系統(tǒng)動態(tài)庫合并成一個

2妈候、減少加載后不會使用的類和方法 ,+load() 方法里的內(nèi)容可以放到首屏渲染完成后再執(zhí)行挂滓,或使用 +initialize() 方法替換掉苦银。因為,在一個 +load() 方法里,進行運行時方法替換操作會帶來 4 毫秒的消耗幔虏。不要小看這 4 毫秒纺念,積少成多,執(zhí)行 +load() 方法對啟動速度的影響會越來越大

3想括、控制C++的全局變量數(shù)

2陷谱、mian()函數(shù)執(zhí)行后

這個時間階段主要是mian()函數(shù)后,一直到AppDelegate里面- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}方法里關(guān)于首頁的相關(guān)方法以及渲染屏幕執(zhí)行完成瑟蜈。

我們在開發(fā)項目的時候烟逊,很多會把各種初始化的工作放在這個階段執(zhí)行,這樣就會影響渲染完成慢铺根,從用戶的角度來說宪躯,也就是加載慢的問題。

那我們該怎優(yōu)化這類問題呢位迂,應該是從功能上梳理出哪些是首頁渲染需要初始化的功能访雪,哪些是APP啟動需要的初始化功能,哪些是只需要在對應的模塊功能使用的時候才需要的初始化的功能掂林,然后再把這些初始化的任務放在相對應的合適位置去執(zhí)行

3臣缀、首屏渲染完成后

這個階段主要是從渲染完成時開始,到?didFinishLaunchingWithOptions:?方法作用域結(jié)束時結(jié)束泻帮。

通俗來說就是 首頁的排版精置、繪制、UI對象操作刑顺。

如果一個首頁相對較復雜的話氯窍,就會涉及到很多圖片和UI繪制渲染,同時也會有很多接口調(diào)用蹲堂,這時候如果我們的程序員編寫的時候不注意狼讨,都放在主線程里執(zhí)行的話,就會阻塞UI對象操作的柒竞,然后出現(xiàn)加載慢的情況

二政供、APP界面卡頓

一般APP界面卡頓主要是因為CPU占用太高,系統(tǒng)中CPU/GPU/顯示器是協(xié)調(diào)工作的朽基,CPU計算好顯示內(nèi)容提交到GPU,GPU渲染完成后將渲染結(jié)果放入幀緩沖區(qū),隨后視頻控制器會按照VSync 信號逐行讀取幀緩沖區(qū)的數(shù)據(jù),經(jīng)過可能的轉(zhuǎn)換傳遞給顯示器顯示.

App主線程開始在CPU中計算顯示內(nèi)容, 比如視圖的創(chuàng)建/布局計算/圖片解碼/文本繪制等. 隨后CPU會將計算好的內(nèi)容提交到 GPU去, 由GPU進行變換/合成/渲染. 隨后GPU 會把渲染結(jié)果提交到幀緩沖區(qū)去,等待下一次 VSync信號到來時顯示到屏幕上. 由于垂直同步的機制, 如果在一個 VSync 時間內(nèi), CPU或者 GPU 沒有完成內(nèi)容提交, 則那一幀就會被丟棄, 等待下一次機會再顯示,而這時顯示屏會保留之前的內(nèi)容不變,這就是界面卡頓的原因布隔。

所以對象創(chuàng)建、對象調(diào)整稼虎、對象釋放衅檀、布局計算、文本計算霎俩、文本渲染哀军、圖片解碼沉眶、圖像渲染這些都有可能導致我們界面卡頓的原因;

這就要求我們在寫代碼的時候

1杉适、盡量推遲對象創(chuàng)建的時間谎倔,并且盡量把創(chuàng)建的對象放在多個任務里去執(zhí)行

2、如 frame/bounds/transform 等實際上都是 CALayer 屬性映射來的, 所以對UIView 的這些屬性進行調(diào)整時, 消耗資源要遠大于一般的屬性. 對此你在應用中,盡量減少不必要的屬性修改

3猿推、對象釋放的時候盡量放到后臺去執(zhí)行片习,或者使用自動釋放

4、盡量少使用圓角蹬叭、陰影這樣的對象屬性藕咏,圖片加載時候使用預加載方式

三、APP網(wǎng)絡請求加載慢

網(wǎng)絡請求加載慢一般情況除了手機網(wǎng)本身網(wǎng)絡慢以外具垫,還有可能是我們同時在執(zhí)行多個網(wǎng)絡請求侈离,阻塞了線程。

前面分享了關(guān)于加載慢的幾種情況筝蚕,接下來說一下如何去監(jiān)控這些慢的問題

監(jiān)控APP加載實際上是監(jiān)控APP的性能問題,所以第一:監(jiān)控CPU的占用率卦碾,第二、監(jiān)控內(nèi)存使用率起宽,第三洲胖、監(jiān)控URL的響應時間

1二鳄、AppDelegate 里獲取APP所占用的CPU

2蓄坏、獲取當前任務所占用的內(nèi)存

3晤柄、獲取APP的流暢度

4析显、監(jiān)控URL的響應時間

最后總結(jié)一下,我們所做的這些監(jiān)控柴墩,只是側(cè)面輔助檢查優(yōu)化我們寫的代碼摹恨,最根本還是要從項目開始的時候設計好架構(gòu)框架登下,編寫代碼的時候多注意這些相關(guān)問題藻糖,盡量減少上面講到的問題出現(xiàn)淹冰,這是我們作為程序猿更應該去關(guān)心和提升的地方。對APP加載慢和如何監(jiān)控的問題巨柒,就說到這里樱拴,有未完整或者不對的地方歡迎留言溝通和指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洋满,一起剝皮案震驚了整個濱河市晶乔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牺勾,老刑警劉巖正罢,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驻民,居然都是意外死亡腺怯,警方通過查閱死者的電腦和手機袱饭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呛占,“玉大人,你說我怎么就攤上這事懦趋×缆牵” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵仅叫,是天一觀的道長帜篇。 經(jīng)常有香客問我,道長诫咱,這世上最難降的妖魔是什么笙隙? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮坎缭,結(jié)果婚禮上竟痰,老公的妹妹穿的比我還像新娘。我一直安慰自己掏呼,他們只是感情好坏快,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憎夷,像睡著了一般莽鸿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拾给,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天祥得,我揣著相機與錄音,去河邊找鬼蒋得。 笑死级及,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窄锅。 我是一名探鬼主播创千,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼入偷!你這毒婦竟也來了追驴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤疏之,失蹤者是張志新(化名)和其女友劉穎殿雪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锋爪,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡丙曙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年爸业,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亏镰。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡扯旷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出索抓,到底是詐尸還是另有隱情钧忽,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布逼肯,位于F島的核電站耸黑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篮幢。R本人自食惡果不足惜大刊,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望三椿。 院中可真熱鬧缺菌,春花似錦、人聲如沸赋续。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纽乱。三九已至蛾绎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸦列,已是汗流浹背租冠。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薯嗤,地道東北人顽爹。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像骆姐,于是被迫代替她去往敵國和親镜粤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

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

  • 什么是內(nèi)存泄漏 1.內(nèi)存泄漏的原因 2.為什么有內(nèi)存泄漏 3.內(nèi)存泄漏都有哪些 1.內(nèi)存泄漏的原因 android...
    海夕_c048閱讀 234評論 0 0
  • 1玻褪、什么是Spring框架肉渴?Spring框架有哪些主要模塊? Spring框架是一個為Java應用程序的開發(fā)提供了...
    你家門口的兩朵云閱讀 168評論 0 1
  • 1.建表的語法 create table 表名( ); 注意:1.表名,字段名,關(guān)鍵字大小寫忽略 2.創(chuàng)建一個用戶...
    王炎鵬閱讀 462評論 0 0
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)带射、焦點同规、注意力、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學現(xiàn)在叫數(shù)據(jù)分析券勺,社會...
    Jenaral閱讀 5,726評論 0 5
  • 城空了关炼,有樹長出來 我的城死了 鑄起它的人程腹,殺死它的人 不愿因為這件事而驕傲 一座城的終結(jié) 永遠因為終結(jié)這件事而顯...
    于十六閱讀 2,865評論 6 17