APP 性能優(yōu)化方案

一惭载、首頁啟動(dòng)速度

  1. 啟動(dòng)過程中生巡,做的事情越少越好冗栗。(盡可能將多個(gè)接口合并)
  2. 不在UI上做耗時(shí)操作心例。(數(shù)據(jù)的處理在子線程中進(jìn)行宵凌,處理完成后通知主線程更新界面)
  3. 在合適的時(shí)機(jī)開始后臺(tái)任務(wù)。(例如:用戶引導(dǎo)界面就開始加載主頁的數(shù)據(jù))
  4. 盡量減少包的大小止后。
  5. 優(yōu)化方法:量化啟動(dòng)時(shí)間瞎惫、啟動(dòng)速度模塊化、輔助工具(友盟、聽云瓜喇、Flurry)

二挺益、頁面瀏覽速度

  1. JSON 的處理。(iOS 自帶的NSJSONSerialization欠橘,Jsonkit矩肩,SBJson)
  2. 數(shù)據(jù)的分頁處理。(后端數(shù)據(jù)多的話應(yīng)該用分頁處理)
  3. 數(shù)據(jù)壓縮肃续。(大數(shù)據(jù)也可以壓縮返回黍檩,減少流量,加快反應(yīng)速度)
  4. 內(nèi)容緩存始锚。(例如網(wǎng)易新聞最新列表都是要緩存到本地刽酱,從本地加載,可以緩存到數(shù)據(jù)瞧捌,內(nèi)存棵里,根據(jù)情況而定)
  5. 延遲加載tableView。(例如:app 有5個(gè)tableView姐呐,可以先加載第一個(gè)顯示的tableView殿怜,按需要加載)
  6. 算法優(yōu)化。(核心算法的優(yōu)化曙砂,例如有些app 的聯(lián)系人通過首字母排序)

三头谜、操作流程

  1. tableView 的優(yōu)化。(cell 的性能)
  2. ViewController加載優(yōu)化鸠澈。(不同view直接的跳轉(zhuǎn)柱告,可以提前準(zhǔn)備好數(shù)據(jù))

四、數(shù)據(jù)庫優(yōu)化

  1. 數(shù)據(jù)庫設(shè)計(jì)面上的重構(gòu)。
  2. 查詢語句的優(yōu)化。
  3. 分庫分表云稚。(數(shù)據(jù)太多的時(shí)候可以分不同的表或庫)

五、服務(wù)端和客戶端的交互優(yōu)化

  1. 客戶端盡量減少請求乖菱。
  2. 服務(wù)器端盡量做多的邏輯處理。
  3. 服務(wù)器端和客戶端采取推拉結(jié)合的方式妹笆。(可以利用一些同步機(jī)制)
  4. 通信協(xié)議的優(yōu)化块请。(減少報(bào)文的大小)
  5. 電量的優(yōu)化拳缠。(盡量不要用后臺(tái)運(yùn)行)

六、非技術(shù)性能優(yōu)化

  1. 產(chǎn)品設(shè)計(jì)的邏輯性贸弥。(產(chǎn)品設(shè)計(jì)一定要符合邏輯窟坐,或者邏輯盡量簡單,有時(shí)候可能會(huì)廢了好大勁才完成一個(gè)小邏輯)
  2. 界面交互規(guī)范。(每個(gè)模塊界面盡量統(tǒng)一哲鸳,符合操作習(xí)慣)
  3. 代碼規(guī)范臣疑。(可以隱形帶來app 性能提高,比如用 if else 還是switch徙菠,或者用讯沈! 還是==)
  4. code review。(堅(jiān)持code review婿奔,持續(xù)代碼重構(gòu)缺狠,減少代碼的復(fù)雜度)
  5. 日常交流。(經(jīng)常分享一些代碼萍摊,或者邏輯中遇到的一些坑)
  1. 啟動(dòng)時(shí)間
    a. 鏈接和接入:可以在time profile 中顯示dyld載入庫函數(shù)挤茄,庫會(huì)映射到地址空間,同事完成綁定及靜態(tài)初始化冰木。
    b. UIKit 初始化:如果rootViewController 由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)第一幀畫面的繪制踊沸。如果你的程序啟動(dòng)很慢歇终,能 做的首先是將與顯示第一屏畫面無關(guān)的操作放到之后執(zhí)行;如果是用XIB文件load第一屏逼龟,XIB文件中的View層也要如果扁平评凝,不要有太多圖層。

  2. 用戶響應(yīng)
    如何讓用戶能感覺到app響應(yīng)迅速呢审轮?當(dāng)然是app 用戶所觸發(fā)的操作能夠立刻響應(yīng)肥哎,即用戶事件(User Event)能夠被主線程的run loop及時(shí)處理。什么是run loop疾渣?可以想象成一個(gè)處理事件的select多路復(fù)用篡诽。主線程中的run loop 當(dāng)然主要是為了處理用戶產(chǎn)生的事件,例如:點(diǎn)擊榴捡、滾動(dòng)等杈女。
    要讓主線程run loop 更好的響應(yīng)用戶事件,工程師盡量減少主線程干重活的時(shí)間吊圾,尤其是讀文件达椰,網(wǎng)絡(luò)操作,大量運(yùn)算這類重活项乒,如果是阻塞操作那就是大忌了啰劲。我們可以用多線程(GCD、NSThread檀何、NSOperationQueue)將這類重活移除在主線程蝇裤,這屬于顯式并發(fā)廷支。還有隱式并發(fā),例如UIView 和CALayer的動(dòng)畫栓辜,layer 的繪制和png 圖片的解碼都是在另一個(gè)子線程中進(jìn)行的恋拍。除了使用多線程技術(shù)減輕主線程的負(fù)擔(dān)外,減少主線程阻塞也是提升用戶體驗(yàn)的一個(gè)方法藕甩。使用instruments 中 time profile 工具中的“recod thread waiting”選項(xiàng)可以統(tǒng)計(jì)出app 運(yùn)行時(shí)各個(gè)線程的阻塞情況施敢,例如:文件讀寫 read/write 、網(wǎng)絡(luò)讀寫send/recv 狭莱、加鎖psynch_mutex_wait 等僵娃。instruments 中的system trace工具能夠記錄所有底層系統(tǒng)調(diào)用。

  3. 內(nèi)存
    內(nèi)存問題從來都是iOS app 老大難的問題贩毕,搞不好程序就爆了 悯许。由于iOS系統(tǒng)沒有Swap文件,在內(nèi)存不足時(shí)會(huì)將只讀數(shù)據(jù)(例如code page)從內(nèi)存中移出辉阶,需要的時(shí)候再從disk上讀如內(nèi)存先壕;可讀寫數(shù)據(jù)不會(huì)被系統(tǒng)從內(nèi)存中移出,然而如果占用的內(nèi)存達(dá)到一個(gè)閾值谆甜,系統(tǒng)會(huì)發(fā)出相應(yīng)的通知和回調(diào)讓應(yīng)用release對象以回收內(nèi)存垃僚,如果仍然不能減少內(nèi)存使用量,系統(tǒng)會(huì)直接關(guān)閉應(yīng)用规辱。尤其是iOS 5.0之后谆棺,如果你的app收到了memory warning,那么腦袋也是和其他app一樣放在了案板上罕袋,隨時(shí)有可能被kill掉改淑,并不是說一定會(huì)先Kill掉在后臺(tái)的app。
    App使用的內(nèi)存除了我們在堆上分配的內(nèi)存外(+[NSobject alloc]/malloc)浴讯,還會(huì)有更多使用內(nèi)存的地方朵夏,比如代碼和全局?jǐn)?shù)據(jù)(TEXT和DATA),線程棧榆纽,圖片仰猖,view 的layer backing store等等。因此處理內(nèi)存問題奈籽,絕不僅僅是我們開發(fā)app時(shí)盡量少申請內(nèi)存那么簡單饥侵。可以用instruments 來調(diào)試內(nèi)存問題衣屏。allocation 和 leaks躏升。

  4. 圖形和動(dòng)畫
    a. Color Blended Layers
    Instruments可以在物理機(jī)上顯示出被混合的圖層Blended Layer(用紅色標(biāo)注),Blended Layer是因?yàn)檫@些Layer是透明的(Transparent)狼忱,系統(tǒng)在渲染這些view時(shí)需要將該view和下層view混合(Blend)后才能計(jì)算出該像素點(diǎn)的實(shí)際顏色煮甥,如果這種blended layer很多盗温,那么在滾動(dòng)列表時(shí)就甭想有流暢的效果藕赞。
    解決blended layer問題也很簡單成肘,檢查紅色區(qū)域view的opaque屬性,記得設(shè)置成YES斧蜕;檢查backgroundColor屬性是不是[UIColor clearColor]双霍,要知道背景顏色為clear color那可是圖形性能的大敵,基本意味著blended layer是跑不了的了批销,為什么洒闸?自己思考一下:)
    b. Color Hits Green and Misses Red
    很多視圖Layer由于Shadow、Mask和Gradient等原因渲染很高均芽,因此UIKit提供了API用于緩存這些Layer:[layer setShouldRasterize:YES]丘逸,系統(tǒng)會(huì)將這些Layer緩存成Bitmap位圖供渲染使用,如果失效時(shí)便丟棄這些Bitmap重新生成掀宋。圖層Rasterization柵格化好處是對刷新率影響較小深纲,壞處是刪格化處理后的Bitmap緩存需要占用內(nèi)存,而且當(dāng)圖層需要縮放時(shí)劲妙,要對刪格化后的Bitmap做額外計(jì)算湃鹊。 使用這個(gè)選項(xiàng)后時(shí),如果Rasterized的Layer失效镣奋,便會(huì)標(biāo)注為紅色币呵,如果有效標(biāo)注為綠色。當(dāng)測試的應(yīng)用頻繁閃現(xiàn)出紅色標(biāo)注圖層時(shí)侨颈,表明對圖層做的Rasterization作用不大余赢。
    c. Color Misaligned Images
    Misaligned Image表示要繪制的點(diǎn)無法直接映射到頻幕上的像素點(diǎn),此時(shí)系統(tǒng)需要對相鄰的像素點(diǎn)做anti-aliasing反鋸齒計(jì)算哈垢,增加了圖形負(fù)擔(dān)妻柒,通常這種問題出在對某些View的Frame重新計(jì)算和設(shè)置時(shí)產(chǎn)生的。
    上圖中被標(biāo)注為黃色的圖層温赔,這是由于圖層顯示的是被縮放后的圖片蛤奢,如果這些圖片是通過網(wǎng)絡(luò)下載的,可以通過程序更新為確定的繪制大小來解決陶贼。還有些系統(tǒng)Navigation Bar和Tool Bar的背景圖片使用的是拉伸(Streched)圖片啤贩,也會(huì)被表示為黃色,這是屬于正常情況拜秧,通常無需修改痹屹。這種問題一般對性能影響不大,而是可能會(huì)在邊緣處虛化枉氮。
    d. Color Offscreen-Rendered Yellow
    Offscreen-Rendering離屏渲染意思是iOS要顯示一個(gè)視圖時(shí)志衍,需要先在后臺(tái)用CPU計(jì)算出視圖的Bitmap暖庄,再交給GPU做Onscreen-Rendering顯示在屏幕上,因?yàn)轱@示一個(gè)視圖需要兩次計(jì)算楼肪,所以這種Offscreen-Rendering會(huì)導(dǎo)致app的圖形性能下降培廓。
    大部分Offscreen-Rendering都是和視圖Layer的Shadow和Mask相關(guān),下列情況會(huì)導(dǎo)致視圖的Offscreen-Rendering: 1. 使用Core Graphics (CG開頭的類)春叫。 2. 使用drawRect()方法肩钠,即使為空。 3. 將CALayer的屬性shouldRasterize設(shè)置為YES暂殖。 4. 使用了CALayer的setMasksToBounds(masks)和setShadow*(shadow)方法价匠。 5. 在屏幕上直接顯示文字,包括Core Text呛每。 6. 設(shè)置UIViewGroupOpacity踩窖。
    e. Color Copied Images Copied Image
    選項(xiàng)可以標(biāo)注應(yīng)用繪制時(shí)被Core Animation復(fù)制的圖片,標(biāo)注成藍(lán)綠色晨横。雖然我在運(yùn)行時(shí)遇到過洋腮,不過個(gè)人感覺對圖形性能影響不大。 (6) Color Immediately颓遏,F(xiàn)lash Updated Regions徐矩, Color OpenGL Fast Path Blue Color Immediately選項(xiàng)表示Instruments在做color-flush操作時(shí)取消10毫秒的延時(shí)。Flash Updated Regions選項(xiàng)用于用紅色示標(biāo)示出在屏幕上使用GPU計(jì)算繪制的圖層叁幢。Color OpenGL Fast Path Blue選項(xiàng)用于用藍(lán)色標(biāo)示出在屏幕上由OpenGL compositor繪制的內(nèi)容滤灯。 這三個(gè)選項(xiàng)對圖形性能的分析意義較小,通常僅作為參考曼玩。

  5. 文件和網(wǎng)絡(luò)I/O
    如果需要對app 的文件和網(wǎng)絡(luò)I/O 情況進(jìn)行分析鳞骤,可以用到這三個(gè)Instruments工具System Usage、File Activity和Network黍判。
    工具System Usage可以統(tǒng)計(jì)出運(yùn)行狀態(tài)下應(yīng)用的文件和網(wǎng)絡(luò)IO操作數(shù)據(jù)豫尽。例如我們發(fā)現(xiàn)應(yīng)用啟動(dòng)后又一個(gè)峰值,這可能存在問題顷帖,我們可以利用System Usage工具的詳細(xì)信息欄查看應(yīng)用是由于對哪些文件的讀寫操作導(dǎo)致了峰值美旧。
    工具File Activity只能在模擬器中運(yùn)行,因此數(shù)據(jù)采集可能不是非常準(zhǔn)確贬墩。它同樣可以詳細(xì)給出讀取的文件屬性榴嗅、大小、載入時(shí)間等信息陶舞,適合與System Usage配合使用嗽测。
    Network工具則可以采集到應(yīng)用的TCP/IP和UDP的使用信息(傳輸?shù)臄?shù)據(jù)量、當(dāng)前所有TCP連接等)肿孵,用得不多唠粥,做網(wǎng)絡(luò)使用狀況分析時(shí)用用還行疏魏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晤愧,隨后出現(xiàn)的幾起案子大莫,更是在濱河造成了極大的恐慌,老刑警劉巖养涮,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葵硕,死亡現(xiàn)場離奇詭異,居然都是意外死亡贯吓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蜀变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悄谐,“玉大人,你說我怎么就攤上這事库北∨澜ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵寒瓦,是天一觀的道長情屹。 經(jīng)常有香客問我,道長杂腰,這世上最難降的妖魔是什么垃你? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喂很,結(jié)果婚禮上惜颇,老公的妹妹穿的比我還像新娘。我一直安慰自己少辣,他們只是感情好凌摄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漓帅,像睡著了一般锨亏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忙干,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天器予,我揣著相機(jī)與錄音,去河邊找鬼豪直。 笑死劣摇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弓乙。 我是一名探鬼主播末融,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼钧惧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勾习?” 一聲冷哼從身側(cè)響起浓瞪,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巧婶,沒想到半個(gè)月后乾颁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艺栈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年英岭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湿右。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诅妹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毅人,到底是詐尸還是另有隱情吭狡,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布丈莺,位于F島的核電站划煮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缔俄。R本人自食惡果不足惜弛秋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牵现。 院中可真熱鬧铐懊,春花似錦、人聲如沸瞎疼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贼急。三九已至茅茂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間太抓,已是汗流浹背空闲。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留走敌,地道東北人碴倾。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跌榔。 傳聞我的和親對象是個(gè)殘疾皇子异雁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • iOS App性能優(yōu)化 29 MAY 2013 on iOS, Performance iOS App的性能關(guān)注點(diǎn)...
    IceWall_Rin閱讀 1,308評(píng)論 0 11
  • 1.啟動(dòng)時(shí)間 應(yīng)用啟動(dòng)時(shí)間長短對用戶第一次體驗(yàn)至關(guān)重要,同時(shí)系統(tǒng)對應(yīng)用的啟動(dòng)僧须、恢復(fù)等狀態(tài)的運(yùn)行時(shí)間也有嚴(yán)格的要求纲刀,...
    心至靜行至遠(yuǎn)閱讀 1,473評(píng)論 2 4
  • 在本系列上一篇《iOS 2D Graphic(1)—— Concept 基本概念和原理》中,我們已經(jīng)了解了關(guān)于iO...
    ac3閱讀 2,196評(píng)論 2 11
  • 有時(shí)候生活很亂担平,讓人不知所措示绊,我就像那麻亂一團(tuán)的煩惱,一直解不開暂论,然后在旋轉(zhuǎn)的道路上上一直繞來繞去面褐,最終,卻還是沒...
    淑琦記閱讀 230評(píng)論 0 1