最近在測試App的時候,發現手機特別容易發燙,咱們都知道 ,若是手機容易發燙,那麼耗電量確定會至關大,手機電量使用的時間也會相對少;對此,我在工做之餘抽了點時間,對手機的耗電量進行了一些研究,但願能夠給你們起到拋磚引玉的做用,對本身的App進行相應的優化,(在咱們的能力範圍內 ,系統問題咱們暫時沒還得靠蘋果大佬那邊進行優化)讓咱們的手機電量的使用時間更長些。html
爲了更好的去優化手機的耗電量 ,我查看了蘋果官方文檔相關的資料,分別主要須要瞭解的有如下幾點: Apple文檔:
算法
入口: UIKit — App Structure (Core APP) — Device Environment (UIDevice) — Getting the Device Battery State 到這裏 ,咱們就能夠看到 耗電量有幾個個重要屬性batteryState
The battery state for the device.緩存
@property(nonatomic, readonly) float batteryLevel; 電池電量範圍從0.0(徹底放電)到1.0(100%充電)。在訪問此屬性以前,請確保已啓用電池監視。性能優化
若是未啓用電池監控,則電池狀態爲且此屬性的值爲-1.0。UIDeviceBatteryStateUnknown
bash
耗電量的狀態服務器
UIDeviceBatteryState
設備的電池電量狀態。網絡
UIDeviceBatteryState
設備的電池電量狀態。app
UIDeviceBatteryState
設備的電池電量狀態。ide
UIDeviceBatteryState
設備的電池電量狀態。分別有以下幾種:UIDeviceBatteryStateUnknown
沒法肯定設備的電池狀態。函數
UIDeviceBatteryStateUnplugged
設備未插入電源; 電池正在放電。
UIDeviceBatteryStateCharging
設備已接通電源,電池電量低於100%。
UIDeviceBatteryStateFull
設備已接通電源,電池100%充電。
經過這張圖,咱們大概能夠了解 ,咱們的手機的耗電量,主要的狀態:
(1)首頁咱們針對CPU和能耗的關係:CPU使用量越大,功率越大,電能消耗越多,電池消耗也就越快。功率大小因爲設備、處理器、其餘硬件資源等會有所不一樣,表1基於閒置狀態(idle state),給出了不一樣CPU使用量的一個大體的對比。
你的app能夠經過分批執行、下降執行頻率來避免產生零散的任務。例如,不採用同一個線程串行執行一系列任務,而是把任務同時放到多個線程,如圖所示。每次使用CPU,內存、緩存、總線等都得通電。經過分批執行,使用時間也更短。由於給定時間內作了更多的工做,須要更多能量,這種策略會致使更大的前期動態功耗。做爲交換,固定能耗減少了,隨着時間推移,這會極大地節省電能。你的app提升了功率,但它更高效,用了更少的時間。這使得CPU回到閒置狀態,其餘元件也更快地斷電
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。 若是必定要用定時器,儘可能高效地使用,能夠參照下列指導方針:
iOS9以後,iPhone增長了低電量模式,用戶若是但願延長iPhone電池的壽命,能夠在設置 > 電池中開啓該功能。開啓該功能以後iOS會採起一些措施,好比:
若是你的app只是須要快速肯定一下用戶的位置,最好用CLLocationManager的requestLocation (iOS9引入)方法。定位完成以後會自動讓硬件斷電。 除了導航,大多數app不須要一直實時更新位置。須要位置服務時開啓一下定位,儘可能多隔一些時間再進行下次位置更新,更新完了以後立刻關掉定位。除非用戶在移動的交通工具裏,不然不頻繁地更新位置通常沒多大問題。下降定位精度。iOS設備默認採用最高精度定位,若是你的app不是確實須要米級的位置信息,不要用最高精度(kCLLocationAccuracyBest)或10米左右的精度(kCLLocationAccuracyNearestTenMeters)。通常來講Core Location提供的精度比你設置的要好,好比你設置爲3千米左右的精度,可能會收到100米左右的精度信息。 若是定位精度一直達不到設置的精度時,中止更新位置,稍後再試。 須要後臺更新位置時,儘可能把pausesLocationUpdatesAutomatically設爲YES,若是用戶不太可能移動的時候系統會自動暫停位置更新。
static NSDateFormatter *cachedDateFormatter = nil;
+ (NSDateFormatter *)cachedDateFormatter {
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @「YYYY-MM-dd HH:mm:ss」];
}
return dateFormatter;
}
複製代碼
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
參考文章: 內存泄漏對耗電量的影響
教你開發省電
耗電量基礎概念