對於iOS效能最佳化的一點看法

來源:互聯網
上載者:User

標籤:FN   文章   obj   設計師   sar   主線程   ons   需求   本地   

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

一、資料壓縮

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

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效能最佳化的一點看法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.