
先來看一組調(diào)研數(shù)據(jù)
- 應(yīng)用首次啟動 出錯以后,79% 的用戶只會在重試一兩次
- 當(dāng)應(yīng)用載入時間超過3秒時,25%的用戶放棄使用該應(yīng)用
- 31%的用戶會將糟糕的體驗(yàn)告訴其他人
以上的調(diào)研數(shù)據(jù)都強(qiáng)調(diào)了性能對于應(yīng)用的重要性
性能會受到很多因素的影響,這些因素包括內(nèi)存消耗, 網(wǎng)絡(luò)寬帶效率以及用戶界面的相應(yīng)速度.我們先概述不同類型的性能特征,然后在對他們進(jìn)行測量
性能指標(biāo)是面向用戶的各個屬性,每種屬性可能是一個或多個測量工程參數(shù)的一個要素
一 影響性能的因素
1.1 內(nèi)存
內(nèi)存涉及運(yùn)行應(yīng)用所需的 RAM 最小值,以及應(yīng)用消耗的內(nèi)存平均值和峰值.最小內(nèi)存值會嚴(yán)重限制硬件,而最高的內(nèi)存平均值和峰值意味著更多的后臺應(yīng)用會被強(qiáng)制關(guān)閉
同時還用確保沒有內(nèi)存泄露, 隨時間流逝而持續(xù)增長的內(nèi)存消耗意味著,應(yīng)用很可能會因?yàn)閮?nèi)存不足的異常而崩潰
1.2 電量消耗
在編寫高性能 代碼時, 電量消耗是一個需要重點(diǎn)處理的重要因素, 就執(zhí)行時間和 CPU 資源的利用而言, 我們不僅要實(shí)現(xiàn)高效的數(shù)據(jù)結(jié)構(gòu)和算法, 還需要考慮其他的因素,如果某個應(yīng)用是個電池黑洞,那么一定不會有人喜歡他
電量消耗不僅僅與計(jì)算 CPU 周期有關(guān),還包括高效的使用硬件, 除了要實(shí)現(xiàn)電量消耗最小化, 還要確保不會影響用戶體驗(yàn)
1.3 初始化時間
應(yīng)用在啟動時應(yīng)執(zhí)行剛好夠用的任務(wù)以完成初始化, 從而滿足用戶的使用需求,執(zhí)行這些消耗的時間就是應(yīng)用的初始化時間, "搞好夠用"是一個開放式用語------正確的平衡點(diǎn)取決于應(yīng)用的需要
在首次使用應(yīng)用時 創(chuàng)建對象并進(jìn)行初始化是一個合理的選擇, 例如:直到需要使用對象時,才創(chuàng)建對象, 這種方式叫做惰性初始化,
下面列舉了 你可能想在應(yīng)用初始化階段執(zhí)行的一些動作
- 檢查應(yīng)用是否是首次啟動
- 檢查用戶是否已經(jīng)登錄
- 如果用戶已經(jīng)登錄, 盡可能地載入之前的狀態(tài)
- 連接服務(wù)器以拉取最新的變更
- 檢查應(yīng)用是否由某個深層鏈接喚起.如果是,還需要載入深層鏈接相應(yīng)的 UI 和狀態(tài)
- 檢查是否存在應(yīng)用上次啟動時 掛起的任務(wù),需要時恢復(fù)他們
- 初始化后續(xù)需要使用的對象和線程池
- 初始化依賴項(xiàng)(如對象關(guān)系映射, 崩潰報(bào)告和緩存)
1.4 執(zhí)行速度
一旦啟動應(yīng)用, 用戶總是希望他可以盡可能快的工作,一切必要的處理都應(yīng)該在盡可能短的時間內(nèi)完成
例如 在照片應(yīng)用中, 用戶通常希望看到調(diào)整高度或?qū)Ρ榷鹊群唵涡Ч膶?shí)時預(yù)覽效果 因此相應(yīng)的處理需要在幾毫秒內(nèi)完成
1.5 相應(yīng)速度
每個應(yīng)用都應(yīng)該快速的相應(yīng)用戶交互, 在應(yīng)用中所做的一切優(yōu)化和權(quán)衡最終都體現(xiàn)在相應(yīng)速度上
App Store中有需要應(yīng)用可以完成相似或者相關(guān)的任務(wù), 這位用戶提供了很大的選擇空間,而用戶基本都會選擇相應(yīng)最快的應(yīng)用
1.6 本地存儲
針對任何在服務(wù)器上存儲數(shù)據(jù)或通過外部來源刷新數(shù)據(jù)的應(yīng)用,開發(fā)人員應(yīng)該對本地存儲的使用有所規(guī)劃.以便應(yīng)用具備離線瀏覽的能力
如果你的應(yīng)用使用了本地存儲,那么請?zhí)峁┮粋€清楚數(shù)據(jù)的選項(xiàng),遺憾的是,市場上的大部分應(yīng)用都沒有提供此選項(xiàng),更讓人煩惱的是,一些應(yīng)用竟然會消耗數(shù)百兆的存儲空間,用戶會頻繁的卸載這些應(yīng)用來回收本地存儲, 這回導(dǎo)致糟糕的用戶體驗(yàn),從而威脅應(yīng)用的成功
一定要向終端用戶提供清空本地緩存的選項(xiàng)
此處打廣告 本人已經(jīng)基于 FMDB 二次封裝了一個 LLFMDB 拿來及用 簡單容易上手 可參考Demo
1.7 互操作性
這個知識點(diǎn)就比較懵懂了 待后續(xù)書中好好研究分析
用戶可能會使用對個應(yīng)用來完成某個任務(wù), 這就需要這些應(yīng)用直接提供互操作的能力, 如一個相冊可能需要一個幻燈片應(yīng)用來實(shí)現(xiàn)最佳的瀏覽效果,但需要另一個應(yīng)用來編輯照片, 其中瀏覽照片的應(yīng)用要能夠?qū)⒄掌l(fā)送到編輯器,并接收編輯后的圖片
IOS 為實(shí)現(xiàn)應(yīng)用間的互操作和數(shù)據(jù)共享提供了多種機(jī)制,其中包括
UIActivityViewController,深層鏈接, MulipeerConnetivity框架,等等
為深層鏈接定義良好的 URL 結(jié)構(gòu)與編寫優(yōu)異的代碼來解析 URL 同樣重要,類似的使用共享對話框共享數(shù)據(jù)時,精確識別用于分享的數(shù)據(jù)非常重要,同時在處理不同數(shù)據(jù)源傳入的數(shù)據(jù)時還有注意安全隱患
1.8 網(wǎng)絡(luò)環(huán)境
移動設(shè)備會在不同網(wǎng)絡(luò)環(huán)境下使用, 為了確保能夠提供最好的用戶體驗(yàn),你的應(yīng)用應(yīng)當(dāng)適應(yīng)各種網(wǎng)絡(luò)條件
- 高寬帶穩(wěn)定網(wǎng)絡(luò)
- 低寬帶穩(wěn)定網(wǎng)絡(luò)
- 高寬帶不穩(wěn)定網(wǎng)絡(luò)
- 高寬帶不穩(wěn)定網(wǎng)絡(luò)
為用戶提供進(jìn)度指示或錯誤信息是相對合理的方式, 無盡的等待或崩潰則讓人無法忍受
如圖因網(wǎng)絡(luò)差或數(shù)據(jù)量大而顯示的不同提示信息

1.9 寬帶
人們會在不同的網(wǎng)絡(luò)條件下使用自己的移動設(shè)備,網(wǎng)速從每秒數(shù)千字節(jié)到每秒數(shù)十兆字節(jié)
因此寬帶的優(yōu)化使用是定義應(yīng)用質(zhì)量的另一個關(guān)鍵參數(shù), 此外在高寬帶網(wǎng)絡(luò)下運(yùn)行一個基于低寬帶網(wǎng)絡(luò)開發(fā)的應(yīng)用可能產(chǎn)生完全不同的結(jié)果
1.10 數(shù)據(jù)刷新
即使沒有提供離線瀏覽能力,你仍可以從服務(wù)器端周期性的刷新數(shù)據(jù),刷新的頻率和每次傳輸?shù)臄?shù)據(jù)量將決定數(shù)據(jù)傳輸?shù)目偭?如果傳輸?shù)淖止?jié)數(shù)過大, 那用戶必然會快速耗盡自己的流量計(jì)劃, 當(dāng)流量消耗大到一定程度時, 你的應(yīng)用很可能會流失用戶
從 IOS7 開始應(yīng)用可以在后臺周期性的刷新數(shù)據(jù), 對于及時聊天應(yīng)用,持久的 HTTP 鏈接或原聲 TCP 鏈接可能會非常有用
1.11 多用戶登錄
是否支持多個并發(fā)用戶取決于產(chǎn)品的需要, 一旦決定提供此功能,請參考以下準(zhǔn)則: ① 添加新用戶應(yīng)盡可能高效② 在不同用戶之間更新應(yīng)盡可能高效③在不同用戶之間切換應(yīng)盡可能高效④用戶數(shù)據(jù)的界限應(yīng)該簡潔且沒有 bug
1.12 單點(diǎn)登錄
如果你已經(jīng)創(chuàng)建了多個允許或需要登錄的應(yīng)用, 那么支持單點(diǎn)登錄就是一個很多的選擇, 如果用戶登錄了一個應(yīng)用, 只需要點(diǎn)一次,就可以登錄到其他的應(yīng)用中
其實(shí)這一點(diǎn)就需要基于大公司背景了就像微信 QQ 微博第三方登錄一樣
1.13 安全
安全對移動應(yīng)用來說是最重要的, 因?yàn)槊舾行畔⒖赡軙趹?yīng)用之間共享,因此 對所有通信以及本地?cái)?shù)據(jù)和共享數(shù)據(jù)進(jìn)行加密就顯得尤為重要了
但是引入多個安全層又會影響性能, 并對用戶體驗(yàn)造成可感知的負(fù)面影響.如何設(shè)定安全的基線需要參考對用戶群體的統(tǒng)計(jì)分析.此外,硬件在其中扮演了重要的角色,選擇會因?yàn)椴煌O(shè)備的計(jì)算能力而有所不同
1.14 崩潰
高性能的應(yīng)用不僅應(yīng)盡可能的避免崩潰.還應(yīng)該在崩潰發(fā)生時優(yōu)雅的恢復(fù), 尤其是在進(jìn)行某個操作的過程中發(fā)生崩潰時
以上即是影響 app 性能的各大因素,
后續(xù)會繼續(xù)總結(jié)書中如何去優(yōu)化這些影響性能的因素