對於iOS效能優化的一點看法

藍光95發表於2018-03-29

在我們通常的開發工作中,每次需求定下來的時候,開發時間都是很緊張的,於是我們就抓緊時間開發,完成需求。在匆忙開發的過程中,或多或少的會有一些效能問題存在,在開發任務完成以後,我們都要進行效能優化。現將我在開發過程中的效能優化問題分享如下。

一、資料壓縮

在程式的執行過程中,資料的傳輸也是影響程式效能的一個方面。在傳輸速度不變的情況下,資料量大,傳輸需要的時間就多,資料量小,傳輸需要的時間自然就少。傳入需要的時間少,我們程式的響應速度自然就變快了。

1. 對網路傳輸的資料進行壓縮

這一步需要和服務端配合,服務端需要開啟資料壓縮的配置。而對於移動端來說,網上開源的AFNetWorking框架已經幫我們實現了這個功能,我們只要在我們定義的網路請求基類中開啟這個功能就可以了。

程式碼如下:

/**
         *  請求資料開啟gzip壓縮
         */
        [self.sessionManager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

2.對下載的圖片進行資料壓縮

這一步對程式效能的提升效果很明顯。我之前在的公司的App是做拍賣的,照片拍的很精細,有的一張圖片好幾M,下載到App,圖片一解析,直接就閃退了。我們進行過跟蹤,這種大圖片下載下來一解析,手機記憶體直接爆了。所以我們對下載的圖片進行了壓縮。

2.1對圖片的尺寸進行壓縮

我們和服務端商量以後進行了改進。我們請求下載圖片的時候,加上圖片的尺寸,服務端返回給我們對應大小的圖片。

客戶端的優化方案:根據螢幕的寬度和設計師給定的尺寸,計算出當前手機需要的圖片尺寸,然帶上尺寸向服務端請求下載圖片

2.2對下載圖片的資料量進行壓縮

下載圖片的資料量的壓縮對效能提升效果是很明顯的。SDWebImage/WebP對圖片的壓縮率高,肉眼看不出差異。只要安裝了這個第三方庫,我們可以像之前一樣使用圖片下載。

二、資料快取

對於一些不需要實時更新的資料,比如圖片、文字,我們可以快取到本地,設定一個過期時間,不需要每次都去載入。這樣既能節省使用者的流量,也能提升我們程式的效能。

對於一些耗時但是又不需要變動的計算結果,我們可以把它快取下來。比如動態cell的行高,耗時的計算結果

三、使用lazyload載入UI和資料

使用lazyload對UI和資料進行載入。lazyload懶載入或者延遲載入,是等到真正需要這個控制元件或者資料的時候才去進行載入,儘可能的保證值載入當前需要的控制元件或者資料,減少載入的任務。不要一進入VC就把所有的資料UI控制元件都載入好,這樣會影響載入速度,從而影響使用者體驗。所以不管是對於資料,還是UI控制元件,我們應該在需要的時候才去載入,把載入過程分散出去,使程式載入儘可能的快

四、使用Instruments對App進行檢測

我們在一個階段的開發任務完成以後,一個使用Instruments對我們的程式的效能進行檢測,從而有針對性的進行優化。

需要進行優化的點如下:

  1. 使用Leaks檢測是否有記憶體洩漏。
  2. 使用Core Animation進行圖層檢測。這篇文章介紹的很詳細。
  3. 使用Time Profile檢測是否有比較耗時的操作,從而進行對應的程式碼優化。

五、集合的使用

在開發過程中,對於一些只用於儲存和讀取,中間不用進行更新的集合,我們應該儘量使用不可變的集合,因為可變集合會佔用比不可變集合更多的記憶體空間。例如:NSArray/NSMutableArray,NSDictionary/NSMutableDictionary
在操作集合的時候,使用正確的集合操作方法。

六、使用GCD來進行優化

對於一些比較耗時的操作,我們應該使用GCD開啟新的一步執行緒來進行操作,使得 App 能夠執行的更加流暢響應更快。但是使用 GCD 時需要注意避免可能引起執行緒爆炸和死鎖的情況,還有非主執行緒處理任務也不是萬能的,如果一個處理需要消耗大量記憶體或者大量CPU操作 GCD 也沒法幫你,只能通過將處理進行拆解分步驟分時間進行處理才比較妥當。

七、I/O效能優化

I/O 是效能消耗大戶,任何的 I/O 操作都會使低功耗狀態被打破,所以減少 I/O 次數是這個效能優化的關鍵點,為了達成這個目下面列出一些方法。

  • 將零碎的內容作為一個整體進行寫入
  • 使用合適的 I/O 操作 API
  • 使用合適的執行緒
  • 使用 NSCache 做快取能夠減少 I/O

八、在耗記憶體操作中合理的使用AutoReleasePool

對於一些大迴圈或者耗記憶體的迴圈,我們應該在迴圈的內部使用AutoRelasePool來進行記憶體的釋放,這樣的話可以保證記憶體儘快的被回收。降低系統的記憶體壓力。

九、耗時操作的快取

在開發的過程中,如果遇到類似日期格式轉換的操作,我們應該對這樣的操作進行快取,因為使用instrument對它進行效能檢測,我們會發現,這是比較耗時的操作。
實際案例:在之前的開發中,我們發現有一個計算ID的操作非常耗時,每次都去計算,非常影響程式的效能。於是我們對計算得到的ID進行快取,在之後的操作中,不再進行計算,直接讀快取結果。我們發現效能有了明顯的提升。

十、演算法優化

開發過程中我們前期可能為了趕專案進度,只是儘量快的去完成開發任務。當我們再回頭看程式碼的時候,發現有的演算法是比較耗時的,還可以對其進行進一步的優化,使我們程式的效能更佳。所以,我們在開發任務不是很重的時候,應該對之前寫的一些演算法進行檢查,優化。

十一、安裝包瘦身

安裝包的大小,對於程式的效能還是有一定影響的。在我們的不斷的版本迭代過程中,或多或少的產生了一些不再需要的圖片、檔案,這些檔案我們在打包的時候也會打包進去,這些檔案以防是安裝包變大,另一方面影響我們程式的效能,我們應該將其刪除。具體的的操作請看我的另一篇文章。傳送門

參考文章:深入剖析 iOS 效能優化

相關文章