先來看一組調研數據
- 應用首次啟動 出錯以后,79% 的用戶只會在重試一兩次
- 當應用載入時間超過3秒時,25%的用戶放棄使用該應用
- 31%的用戶會將糟糕的體驗告訴其他人
以上的調研數據都強調了性能對于應用的重要性
性能會受到很多因素的影響,這些因素包括內存消耗, 網絡寬帶效率以及用戶界面的相應速度.我們先概述不同類型的性能特征,然后在對他們進行測量
性能指標是面向用戶的各個屬性,每種屬性可能是一個或多個測量工程參數的一個要素
一 影響性能的因素
1.1 內存
內存涉及運行應用所需的 RAM 最小值,以及應用消耗的內存平均值和峰值.最小內存值會嚴重限制硬件,而最高的內存平均值和峰值意味著更多的后臺應用會被強制關閉
同時還用確保沒有內存泄露, 隨時間流逝而持續增長的內存消耗意味著,應用很可能會因為內存不足的異常而崩潰
1.2 電量消耗
在編寫高性能 代碼時, 電量消耗是一個需要重點處理的重要因素, 就執行時間和 CPU 資源的利用而言, 我們不僅要實現高效的數據結構和算法, 還需要考慮其他的因素,如果某個應用是個電池黑洞,那么一定不會有人喜歡他
電量消耗不僅僅與計算 CPU 周期有關,還包括高效的使用硬件, 除了要實現電量消耗最小化, 還要確保不會影響用戶體驗
1.3 初始化時間
應用在啟動時應執行剛好夠用的任務以完成初始化, 從而滿足用戶的使用需求,執行這些消耗的時間就是應用的初始化時間, "搞好夠用"是一個開放式用語------正確的平衡點取決于應用的需要
在首次使用應用時 創建對象并進行初始化是一個合理的選擇, 例如:直到需要使用對象時,才創建對象, 這種方式叫做惰性初始化,
下面列舉了 你可能想在應用初始化階段執行的一些動作
- 檢查應用是否是首次啟動
- 檢查用戶是否已經登錄
- 如果用戶已經登錄, 盡可能地載入之前的狀態
- 連接服務器以拉取最新的變更
- 檢查應用是否由某個深層鏈接喚起.如果是,還需要載入深層鏈接相應的 UI 和狀態
- 檢查是否存在應用上次啟動時 掛起的任務,需要時恢復他們
- 初始化后續需要使用的對象和線程池
- 初始化依賴項(如對象關系映射, 崩潰報告和緩存)
1.4 執行速度
一旦啟動應用, 用戶總是希望他可以盡可能快的工作,一切必要的處理都應該在盡可能短的時間內完成
例如 在照片應用中, 用戶通常希望看到調整高度或對比度等簡單效果的實時預覽效果 因此相應的處理需要在幾毫秒內完成
1.5 相應速度
每個應用都應該快速的相應用戶交互, 在應用中所做的一切優化和權衡最終都體現在相應速度上
App Store中有需要應用可以完成相似或者相關的任務, 這位用戶提供了很大的選擇空間,而用戶基本都會選擇相應最快的應用
1.6 本地存儲
針對任何在服務器上存儲數據或通過外部來源刷新數據的應用,開發人員應該對本地存儲的使用有所規劃.以便應用具備離線瀏覽的能力
如果你的應用使用了本地存儲,那么請提供一個清楚數據的選項,遺憾的是,市場上的大部分應用都沒有提供此選項,更讓人煩惱的是,一些應用竟然會消耗數百兆的存儲空間,用戶會頻繁的卸載這些應用來回收本地存儲, 這回導致糟糕的用戶體驗,從而威脅應用的成功
一定要向終端用戶提供清空本地緩存的選項
此處打廣告 本人已經基于 FMDB 二次封裝了一個 LLFMDB 拿來及用 簡單容易上手 可參考Demo
1.7 互操作性
這個知識點就比較懵懂了 待后續書中好好研究分析
用戶可能會使用對個應用來完成某個任務, 這就需要這些應用直接提供互操作的能力, 如一個相冊可能需要一個幻燈片應用來實現最佳的瀏覽效果,但需要另一個應用來編輯照片, 其中瀏覽照片的應用要能夠將照片發送到編輯器,并接收編輯后的圖片
IOS 為實現應用間的互操作和數據共享提供了多種機制,其中包括
UIActivityViewController,深層鏈接, MulipeerConnetivity框架,等等
為深層鏈接定義良好的 URL 結構與編寫優異的代碼來解析 URL 同樣重要,類似的使用共享對話框共享數據時,精確識別用于分享的數據非常重要,同時在處理不同數據源傳入的數據時還有注意安全隱患
1.8 網絡環境
移動設備會在不同網絡環境下使用, 為了確保能夠提供最好的用戶體驗,你的應用應當適應各種網絡條件
- 高寬帶穩定網絡
- 低寬帶穩定網絡
- 高寬帶不穩定網絡
- 高寬帶不穩定網絡
為用戶提供進度指示或錯誤信息是相對合理的方式, 無盡的等待或崩潰則讓人無法忍受
如圖因網絡差或數據量大而顯示的不同提示信息
1.9 寬帶
人們會在不同的網絡條件下使用自己的移動設備,網速從每秒數千字節到每秒數十兆字節
因此寬帶的優化使用是定義應用質量的另一個關鍵參數, 此外在高寬帶網絡下運行一個基于低寬帶網絡開發的應用可能產生完全不同的結果
1.10 數據刷新
即使沒有提供離線瀏覽能力,你仍可以從服務器端周期性的刷新數據,刷新的頻率和每次傳輸的數據量將決定數據傳輸的總量,如果傳輸的字節數過大, 那用戶必然會快速耗盡自己的流量計劃, 當流量消耗大到一定程度時, 你的應用很可能會流失用戶
從 IOS7 開始應用可以在后臺周期性的刷新數據, 對于及時聊天應用,持久的 HTTP 鏈接或原聲 TCP 鏈接可能會非常有用
1.11 多用戶登錄
是否支持多個并發用戶取決于產品的需要, 一旦決定提供此功能,請參考以下準則: ① 添加新用戶應盡可能高效② 在不同用戶之間更新應盡可能高效③在不同用戶之間切換應盡可能高效④用戶數據的界限應該簡潔且沒有 bug
1.12 單點登錄
如果你已經創建了多個允許或需要登錄的應用, 那么支持單點登錄就是一個很多的選擇, 如果用戶登錄了一個應用, 只需要點一次,就可以登錄到其他的應用中
其實這一點就需要基于大公司背景了就像微信 QQ 微博第三方登錄一樣
1.13 安全
安全對移動應用來說是最重要的, 因為敏感信息可能會在應用之間共享,因此 對所有通信以及本地數據和共享數據進行加密就顯得尤為重要了
但是引入多個安全層又會影響性能, 并對用戶體驗造成可感知的負面影響.如何設定安全的基線需要參考對用戶群體的統計分析.此外,硬件在其中扮演了重要的角色,選擇會因為不同設備的計算能力而有所不同
1.14 崩潰
高性能的應用不僅應盡可能的避免崩潰.還應該在崩潰發生時優雅的恢復, 尤其是在進行某個操作的過程中發生崩潰時
以上即是影響 app 性能的各大因素,
后續會繼續總結書中如何去優化這些影響性能的因素