iOS性能優化之耗電量

iOS性能優化之耗電量

前言

最近在測試App的時候,發現手機特別容易發燙,咱們都知道 ,若是手機容易發燙,那麼耗電量確定會至關大,手機電量使用的時間也會相對少;對此,我在工做之餘抽了點時間,對手機的耗電量進行了一些研究,但願能夠給你們起到拋磚引玉的做用,對本身的App進行相應的優化,(在咱們的能力範圍內 ,系統問題咱們暫時沒還得靠蘋果大佬那邊進行優化)讓咱們的手機電量的使用時間更長些。html

1、耗電量相關知識的瞭解

爲了更好的去優化手機的耗電量 ,我查看了蘋果官方文檔相關的資料,分別主要須要瞭解的有如下幾點: Apple文檔:算法

  1. 入口: UIKit — App Structure (Core APP) — Device Environment (UIDevice) — Getting the Device Battery State 到這裏 ,咱們就能夠看到 耗電量有幾個個重要屬性batteryStateThe battery state for the device.緩存

  2. @property(nonatomic, readonly) float batteryLevel; 電池電量範圍從0.0(徹底放電)到1.0(100%充電)。在訪問此屬性以前,請確保已啓用電池監視。性能優化

若是未啓用電池監控,則電池狀態爲且此屬性的值爲-1.0。UIDeviceBatteryStateUnknownbash

  1. 耗電量的狀態服務器

  2. UIDeviceBatteryState設備的電池電量狀態。網絡

  3. UIDeviceBatteryState設備的電池電量狀態。app

  4. UIDeviceBatteryState設備的電池電量狀態。ide

UIDeviceBatteryState設備的電池電量狀態。分別有以下幾種:UIDeviceBatteryStateUnknown沒法肯定設備的電池狀態。函數

UIDeviceBatteryStateUnplugged設備未插入電源; 電池正在放電。

UIDeviceBatteryStateCharging設備已接通電源,電池電量低於100%。

UIDeviceBatteryStateFull設備已接通電源,電池100%充電。

2、耗電量的基本概念

圖一

經過這張圖,咱們大概能夠了解 ,咱們的手機的耗電量,主要的狀態:

  1. Idle 狀態說明 app 處於休眠狀態,幾乎不使用電量。
  2. Active 狀態說明 app 處於前臺工做狀態,用電量比較高,咱們能夠看到圖中的第二個 Active 的耗電遠高於第一個,這主要由於 app 實際所作的工做類型不一樣而致使的。
  3. Overhead 指的是調起硬件來支持 app 功能所消耗的電量(原文是 bring hardware up)。note:若是你的 app 就算只作了一點點事,Overhead 所帶來的電量消耗都是一點不會減小的! 圖中,橫線如下所包區域是固定開銷(Fixed Cost),橫線以上區域是動態開銷(Dynamic cost)。

3、影響電量的因素

  1. CPU 處理(Processing)
  2. 網絡(Networking)
  3. 圖像(Graphics)
  4. 定位(Location)

(1)首頁咱們針對CPU和能耗的關係:CPU使用量越大,功率越大,電能消耗越多,電池消耗也就越快。功率大小因爲設備、處理器、其餘硬件資源等會有所不一樣,表1基於閒置狀態(idle state),給出了不一樣CPU使用量的一個大體的對比。

咱們在使用咱們app執行任務有動態能耗(dynamic cost)和固定能耗(fixed cost)。

  1. 動態能耗也就是app實際工做消耗的能量。
  2. 固定能耗是在任務執行先後把系統和各類資源調用起來和關閉所消耗的能量。出現大量零散的工做時,在零散的任務之間由於資源可能永遠無法真正變爲閒置,因此有動態能耗的同時固定能耗也很高。這種狀況致使大量電能在相對較小的實際工做中流失了。下圖是動態能耗和固定能耗圖 如圖一

4、優化方案

1. 減小固定能耗交換動態能耗

你的app能夠經過分批執行、下降執行頻率來避免產生零散的任務。例如,不採用同一個線程串行執行一系列任務,而是把任務同時放到多個線程,如圖所示。每次使用CPU,內存、緩存、總線等都得通電。經過分批執行,使用時間也更短。由於給定時間內作了更多的工做,須要更多能量,這種策略會致使更大的前期動態功耗。做爲交換,固定能耗減少了,隨着時間推移,這會極大地節省電能。你的app提升了功率,但它更高效,用了更少的時間。這使得CPU回到閒置狀態,其餘元件也更快地斷電

圖2

2. 少使用定時器或者用高級的定時器

GCD裏的dispatch queues、dispatch semaphores等同步工具比定時器效率高不少,儘可能不要用定時器作同步工具。全部須要指定一個最後期限的函數或方法都屬於定時器,好比: a. 高級定時器包括dispatch timer sources、CFRunLoopTimerCreate和其餘CFRunLoopTimer函數、NSTimer、performSelector:withObject:afterDelay:方法。 b. 底層定時器包括sleep, usleep, nanosleep, pthread_cond_timedwait, select, poll, kevent, dispatch_after, dispatch_semaphore_wait。 若是必定要用定時器,儘可能高效地使用,能夠參照下列指導方針:

  1. 設置一個合適的超時時間。
  2. 再也不須要時及時關閉重複性定時器。
  3. 設置觸發公差。

3. 使用低電量模式

iOS9以後,iPhone增長了低電量模式,用戶若是但願延長iPhone電池的壽命,能夠在設置 > 電池中開啓該功能。開啓該功能以後iOS會採起一些措施,好比:

  1. 下降CPU和GPU性能
  2. 暫停隨意的和後臺的活動,包括網絡
  3. 下降屏幕亮度
  4. 縮短自動鎖屏時間
  5. 關閉郵件刷新
  6. 關閉視角縮放
  7. 關閉動態壁紙

4.縮減網絡請求

  1. 減小、壓縮網絡數據。能夠下降上傳或下載的多媒體內容質量和尺寸等。
  2. 使用緩存,不要重複下載相同的數據。
  3. 使用斷點續傳,不然網絡不穩定時可能屢次傳輸相同的內容。
  4. 網絡不可用時不要嘗試執行網絡請求,儘可能只在Wi-Fi狀況下聯網。
  5. 讓用戶能夠取消長時間運行或者速度很慢的網絡操做,設置合適的超時時間。

5. 延遲聯網和 圖像、動畫、視頻優化

  1. 延遲網絡:分批傳輸。好比,下載視頻流時,不要傳輸很小的數據包,直接下載整個文件或者一大塊一大塊地下載。若是提供廣告,一次性多下載一些,而後再慢慢展現。若是要從服務器下載電子郵件,一次下載多條,不要一條一條地下載。網絡操做能推遲就推遲。若是經過HTTP上傳、下載數據,建議使用NSURLSession中的後臺會話,這樣系統能夠針對整個設備全部的網絡操做優化功耗。將能夠推遲的操做盡可能推遲到設備充電狀態而且鏈接Wi-Fi時進行,好比同步和備份工做。
  2. 圖像 減小不透明視圖的使用,好比視圖上顯示一個半透明模糊效果。若是要用不透明效果,避免用在內容頻繁變化的地方。另外,因爲內容變化後背景視圖和半透明視圖必須同時改變,這也會放大功耗。
  3. 避免繪製不可見的內容,好比app的內容被其餘視圖遮擋、被剪切(clipped)或者出畫了。
  4. 動畫儘量用較低的幀率。好比,高幀率在玩遊戲時有意義,可是菜單畫面可能較低的幀率就夠了。只有對用戶體驗有影響時才使用高幀率。

6. 優化定位

若是你的app只是須要快速肯定一下用戶的位置,最好用CLLocationManager的requestLocation (iOS9引入)方法。定位完成以後會自動讓硬件斷電。 除了導航,大多數app不須要一直實時更新位置。須要位置服務時開啓一下定位,儘可能多隔一些時間再進行下次位置更新,更新完了以後立刻關掉定位。除非用戶在移動的交通工具裏,不然不頻繁地更新位置通常沒多大問題。下降定位精度。iOS設備默認採用最高精度定位,若是你的app不是確實須要米級的位置信息,不要用最高精度(kCLLocationAccuracyBest)或10米左右的精度(kCLLocationAccuracyNearestTenMeters)。通常來講Core Location提供的精度比你設置的要好,好比你設置爲3千米左右的精度,可能會收到100米左右的精度信息。 若是定位精度一直達不到設置的精度時,中止更新位置,稍後再試。 須要後臺更新位置時,儘可能把pausesLocationUpdatesAutomatically設爲YES,若是用戶不太可能移動的時候系統會自動暫停位置更新。

7. 代碼層面優化

  1. 合理使用NSDateFormatter 和 NSCalendar這種高開銷對象 性能測試代表,NSDateFormatter的性能瓶頸是因爲NSDate格式到NSString格式的轉化,因此把NSDateFormatter建立單例意義不大.推薦的作法是,把最經常使用到的日期格式作緩存.
static NSDateFormatter *cachedDateFormatter = nil;

+ (NSDateFormatter *)cachedDateFormatter {

if (!dateFormatter) {

dateFormatter = [[NSDateFormatter alloc] init];


[dateFormatter setDateFormat: @「YYYY-MM-dd HH:mm:ss」];

}

return dateFormatter;

}
複製代碼
  1. 不要頻繁的刷新頁面,能刷新1行cell最好只刷新一行,儘可能不要使用reloadData.
  2. 選擇正確的集合 NSArray,使用index來查找很快(插入和刪除很慢) 字典,使用鍵來查找很快 NSSets,是無序的,用鍵查找很快,插入/刪除很快
  3. 少用運算得到圓角,不論view.maskToBounds仍是layer.clipToBounds都會有很大的資源開銷,必需要用圓角的話,不如把圖片自己就作成圓角
  4. 懶加載,不要一次性建立全部的subview,而是須要時才建立.
  5. 重用 能夠模仿UITableView和UICollectionView,不要一次性建立全部的subview,而是須要時才建立.完成了使命,把他放入到一個可重用集合中
  6. 圖片處理 圖片與imageView相同大小,避免多餘運算 可使用整副的圖片,增長應用體積,可是節省CPU 可調大小的圖片,能夠省去一些沒必要要的空間 CALayer,CoreGraphics,甚至OpenGL來繪製,消耗CPU
  7. cache,cache,cache(緩存全部須要的) 服務器相應結果的緩存(圖片) 複雜計算結果的緩存(UITableView的行高)
  8. 儘可能少用透明或半透明,會產生額外的運算.
  9. 使用ARC減小內存失誤,dealloc須要重寫並對屬性置爲nil
  10. 避免龐大的xib,storyBoard,儘可能使用純代碼開發

8.CPU層面優化

1.Timer的時間間隔不宜過短,知足需求便可 2.線程適量,不宜過多,不要阻塞主線程 3.優化算法,減小循環次數 4.定位和藍牙按需取用,定位以後要關閉或下降定位頻率

數據採集步驟

因爲直接數據採集會出現較大偏差,建議使用如下方法進行數據採集: 1.在設備上進入設置 > 2. 開發者 > 3. Logging > 4. Enery打開 > 5. Networking打開> 6.點擊 Start Recording > 7. 而後點開咱們想要測試的App,進行測試,定好時間,> 8.時間到了後點擊 中止 Stop Recording > 9.在Instruments中選擇好設備,進入Energy Log > 10.選擇File > Import Logged Data from Device

參考文章: 內存泄漏對耗電量的影響 教你開發省電 耗電量基礎概念

相關文章
相關標籤/搜索