一惭载、首頁啟動(dòng)速度
- 啟動(dòng)過程中生巡,做的事情越少越好冗栗。(盡可能將多個(gè)接口合并)
- 不在UI上做耗時(shí)操作心例。(數(shù)據(jù)的處理在子線程中進(jìn)行宵凌,處理完成后通知主線程更新界面)
- 在合適的時(shí)機(jī)開始后臺(tái)任務(wù)。(例如:用戶引導(dǎo)界面就開始加載主頁的數(shù)據(jù))
- 盡量減少包的大小止后。
- 優(yōu)化方法:量化啟動(dòng)時(shí)間瞎惫、啟動(dòng)速度模塊化、輔助工具(友盟、聽云瓜喇、Flurry)
二挺益、頁面瀏覽速度
- JSON 的處理。(iOS 自帶的NSJSONSerialization欠橘,Jsonkit矩肩,SBJson)
- 數(shù)據(jù)的分頁處理。(后端數(shù)據(jù)多的話應(yīng)該用分頁處理)
- 數(shù)據(jù)壓縮肃续。(大數(shù)據(jù)也可以壓縮返回黍檩,減少流量,加快反應(yīng)速度)
- 內(nèi)容緩存始锚。(例如網(wǎng)易新聞最新列表都是要緩存到本地刽酱,從本地加載,可以緩存到數(shù)據(jù)瞧捌,內(nèi)存棵里,根據(jù)情況而定)
- 延遲加載tableView。(例如:app 有5個(gè)tableView姐呐,可以先加載第一個(gè)顯示的tableView殿怜,按需要加載)
- 算法優(yōu)化。(核心算法的優(yōu)化曙砂,例如有些app 的聯(lián)系人通過首字母排序)
三头谜、操作流程
- tableView 的優(yōu)化。(cell 的性能)
- ViewController加載優(yōu)化鸠澈。(不同view直接的跳轉(zhuǎn)柱告,可以提前準(zhǔn)備好數(shù)據(jù))
四、數(shù)據(jù)庫優(yōu)化
- 數(shù)據(jù)庫設(shè)計(jì)面上的重構(gòu)。
- 查詢語句的優(yōu)化。
- 分庫分表云稚。(數(shù)據(jù)太多的時(shí)候可以分不同的表或庫)
五、服務(wù)端和客戶端的交互優(yōu)化
- 客戶端盡量減少請求乖菱。
- 服務(wù)器端盡量做多的邏輯處理。
- 服務(wù)器端和客戶端采取推拉結(jié)合的方式妹笆。(可以利用一些同步機(jī)制)
- 通信協(xié)議的優(yōu)化块请。(減少報(bào)文的大小)
- 電量的優(yōu)化拳缠。(盡量不要用后臺(tái)運(yùn)行)
六、非技術(shù)性能優(yōu)化
- 產(chǎn)品設(shè)計(jì)的邏輯性贸弥。(產(chǎn)品設(shè)計(jì)一定要符合邏輯窟坐,或者邏輯盡量簡單,有時(shí)候可能會(huì)廢了好大勁才完成一個(gè)小邏輯)
- 界面交互規(guī)范。(每個(gè)模塊界面盡量統(tǒng)一哲鸳,符合操作習(xí)慣)
- 代碼規(guī)范臣疑。(可以隱形帶來app 性能提高,比如用 if else 還是switch徙菠,或者用讯沈! 還是==)
- code review。(堅(jiān)持code review婿奔,持續(xù)代碼重構(gòu)缺狠,減少代碼的復(fù)雜度)
- 日常交流。(經(jīng)常分享一些代碼萍摊,或者邏輯中遇到的一些坑)
啟動(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層也要如果扁平评凝,不要有太多圖層。用戶響應(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)用。內(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躏升。圖形和動(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)對圖形性能的分析意義較小,通常僅作為參考曼玩。文件和網(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í)用用還行疏魏。