1. 程式人生 > >對於iOS性能優化的一點看法

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

cep GC 開啟 空間 mat 壓力 緩存 tools span

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

一、數據壓縮

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

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

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

代碼如下:

[objc] view plain copy
  1. /**
  2. * 請求數據開啟gzip壓縮
  3. */
  4. [self.sessionManager.requestSerializer setValue:www.boshenyl.cn @www.wanmeiyuele.cn "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/dasheng178.com/ 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性能優化的一點看法