對於iOS性能優化的一點見解

在咱們一般的開發工做中,每次需求定下來的時候,開發時間都是很緊張的,因而咱們就抓緊時間開發,完成需求。在匆忙開發的過程當中,或多或少的會有一些性能問題存在,在開發任務完成之後,咱們都要進行性能優化。現將我在開發過程當中的性能優化問題分享以下。算法

性能優化的總體一覽圖以下:swift

圖片描述

1、數據壓縮

在程序的運行過程當中,數據的傳輸也是影響程序性能的一個方面。在傳輸速度不變的狀況下,數據量大,傳輸須要的時間就多,數據量小,傳輸須要的時間天然就少。傳入須要的時間少,咱們程序的響應速度天然就變快了。緩存

1. 對網絡傳輸的數據進行壓縮

這一步須要和服務端配合,服務端須要開啓數據壓縮的配置。而對於移動端來講,網上開源的AFNetWorking框架已經幫咱們實現了這個功能,咱們只要在咱們定義的網絡請求基類中開啓這個功能就能夠了。性能優化

代碼以下:網絡

/**
         *  請求數據開啓gzip壓縮
         */
        [self.sessionManager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

2.對下載的圖片進行數據壓縮

這一步對程序性能的提高效果很明顯。我以前在的公司的App是作拍賣的,照片拍的很精細,有的一張圖片好幾M,下載到App,圖片一解析,直接就閃退了。咱們進行過跟蹤,這種大圖片下載下來一解析,手機內存直接爆了。因此咱們對下載的圖片進行了壓縮。session

2.1對圖片的尺寸進行壓縮

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

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

2.2對下載圖片的數據量進行壓縮

下載圖片的數據量的壓縮對性能提高效果是很明顯的。SDWebImage/WebP對圖片的壓縮率高,肉眼看不出差別。只要安裝了這個第三方庫,咱們能夠像以前同樣使用圖片下載。優化

2、數據緩存

對於一些不須要實時更新的數據,好比圖片、文本,咱們能夠緩存到本地,設置一個過時時間,不須要每次都去加載。這樣既能節省用戶的流量,也能提高咱們程序的性能。ui

對於一些耗時可是又不須要變更的計算結果,咱們能夠把它緩存下來。好比動態cell的行高,耗時的計算結果

3、使用lazyload加載UI和數據

使用lazyload對UI和數據進行加載。lazyload懶加載或者延遲加載,是等到真正須要這個控件或者數據的時候纔去進行加載,儘量的保證值加載當前須要的控件或者數據,減小加載的任務。不要一進入VC就把全部的數據UI控件都加載好,這樣會影響加載速度,從而影響用戶體驗。因此不論是對於數據,仍是UI控件,咱們應該在須要的時候纔去加載,把加載過程分散出去,使程序加載儘量的快

4、使用Instruments對App進行檢測

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

須要進行優化的點以下:

  1. 使用Leaks檢測是否有內存泄漏。
  2. 使用Core Animation進行圖層檢測。這篇文章介紹的很詳細。
  3. 使用Time Profile檢測是否有比較耗時的操做,從而進行對應的代碼優化。

5、集合的使用

在開發過程當中,對於一些只用於存儲和讀取,中間不用進行更新的集合,咱們應該儘可能使用不可變的集合,由於可變集合會佔用比不可變集合更多的內存空間。例如:NSArray/NSMutableArray,NSDictionary/NSMutableDictionary
在操做集合的時候,使用正確的集合操做方法。

6、使用GCD來進行優化

對於一些比較耗時的操做,咱們應該使用GCD開啓新的一步線程來進行操做,使得 App 可以運行的更加流暢響應更快。可是使用 GCD 時須要注意避免可能引發線程爆炸和死鎖的狀況,還有非主線程處理任務也不是萬能的,若是一個處理須要消耗大量內存或者大量CPU操做 GCD 也無法幫你,只能經過將處理進行拆解分步驟分時間進行處理才比較穩當。

7、I/O性能優化

I/O 是性能消耗大戶,任何的 I/O 操做都會使低功耗狀態被打破,因此減小 I/O 次數是這個性能優化的關鍵點,爲了達成這個目下面列出一些方法。
  • 將零碎的內容做爲一個總體進行寫入
  • 使用合適的 I/O 操做 API
  • 使用合適的線程
  • 使用 NSCache 作緩存可以減小 I/O

8、在耗內存操做中合理的使用AutoReleasePool

對於一些大循環或者耗內存的循環,咱們應該在循環的內部使用AutoRelasePool來進行內存的釋放,這樣的話能夠保證內存儘快的被回收。下降系統的內存壓力。

9、耗時操做的緩存

在開發的過程當中,若是遇到相似日期格式轉換的操做,咱們應該對這樣的操做進行緩存,由於使用instrument對它進行性能檢測,咱們會發現,這是比較耗時的操做。
實際案例:在以前的開發中,咱們發現有一個計算ID的操做很是耗時,每次都去計算,很是影響程序的性能。因而咱們對計算獲得的ID進行緩存,在以後的操做中,再也不進行計算,直接讀緩存結果。咱們發現性能有了明顯的提高。

10、算法優化

開發過程當中咱們前期可能爲了趕項目進度,只是儘可能快的去完成開發任務。當咱們再回頭看代碼的時候,發現有的算法是比較耗時的,還能夠對其進行進一步的優化,使咱們程序的性能更佳。因此,咱們在開發任務不是很重的時候,應該對以前寫的一些算法進行檢查,優化。

11、安裝包瘦身

安裝包的大小,對於程序的性能仍是有必定影響的。在咱們的不斷的版本迭代過程當中,或多或少的產生了一些再也不須要的圖片、文件,這些文件咱們在打包的時候也會打包進去,這些文件以防是安裝包變大,另外一方面影響咱們程序的性能,咱們應該將其刪除。具體的的操做請看個人另外一篇文章。傳送門

參考文章:深刻剖析 iOS 性能優化

相關文章
相關標籤/搜索