使用xcode打開你的工程,然后插上手機,使用真機running項目(必須是真機),然后comand + 6,點擊Energy Impact
其中顏色表示
-
藍色:
表示合理 -
黃色:
表示程序比較耗電 -
紅色:
表示僅僅輕度使用你的程序,就會很耗電.
其中名詞解釋:
-
Utilization :
表示瞬時耗電情況 -
Average :
表示平均耗電情況 -
Energy Impact:
:表示耗電影響
cost(藍色)
表示運行項目代碼需要電量Overhead(紅色)
表示開銷,包括CPU的喚起,無線電模組(藍牙&WiFi),和其他系統(tǒng)資源的調(diào)用等
影響電量的五個因素,灰色表示有電量消耗,白色表示沒有電量消耗
-
Network :
網(wǎng)絡(luò)活動會喚起需要長時間周期性供電的無線電模組,可以分批次進行網(wǎng)絡(luò)請求,來降低開銷. -
Location :
精密&高頻的的定位會增加開銷,需要按需使用. -
CPU :
CPU使用率超過20%就會快速耗干電池電量.高效使用CPU,并且當用戶出現(xiàn)模糊輸入時快速做出不做事情的反應(yīng). -
GPU :
圖形處理器(顯卡的處理器),亂使用GPU會導(dǎo)致交互差,并且降低電池壽命. -
Background :
后臺狀態(tài)App仍會消耗電量,App要按需執(zhí)行后臺操作,并使用延遲APIs來保證系統(tǒng)運算高效執(zhí)行.另外,在app進入后臺狀態(tài)是,立即減少動作,并且通知系統(tǒng)一次這些動作已經(jīng)完成.
耗電量優(yōu)化
1 網(wǎng)絡(luò)方面優(yōu)化
請求前判斷網(wǎng)絡(luò)狀態(tài),網(wǎng)絡(luò)不可用卓囚,不要嘗試執(zhí)行網(wǎng)絡(luò)請求;
請求前設(shè)置合適的超時時間,避免長時間運行或者速度很慢的網(wǎng)絡(luò)操作,
請求過程盡量使用斷點續(xù)傳,否則網(wǎng)絡(luò)不穩(wěn)定的時候可能多次傳輸相同的內(nèi)容。(傳輸1M文件辛友,如果一次性下載速侈,一旦網(wǎng)絡(luò)問題下載失敗率寡,下次重新請求,會從頭開始倚搬。之前下載過的部分會進行重新下載冶共,斷點續(xù)傳可以保證之前下載的數(shù)據(jù)緩存起來);
減少每界、壓縮網(wǎng)絡(luò)數(shù)據(jù)捅僵。(不同格式數(shù)據(jù)提交關(guān)系:XML提交比較大;JSON 提交比較小眨层,protobuf提交最忻沓)
請求結(jié)果使用緩存
批量傳輸,避免多次WIFI多次上電吊電趴樱。比如下載視頻流時馒闷,不要傳輸很小的數(shù)據(jù)包,直接下載整個文件或者一大塊一大塊地下載叁征。如果下載廣告纳账,一次性多下載一些,然后再慢慢展示捺疼。如果下載電子郵件疏虫,一次下載多封,不要一封一封地下載啤呼。
2 定位優(yōu)化
- 如果不是導(dǎo)航的應(yīng)用卧秘,盡量不要實時更新位置,定位完畢就關(guān)掉定位服務(wù)官扣;
- 如果只是需要快速確定用戶的位置翅敌,最好用CLLocationManager的requestLocation方法。定位完成后醇锚,會自動讓定位硬件斷電哼御;
- 盡量降低定位精度,比如盡量不要使用精度最高的KCLLocationAccuracyBest焊唬;精度越高恋昼,硬件模塊功耗越大;
- 需要后臺定位時赶促,盡量設(shè)置
pauseLocationUpdatesAutomatically
為YES液肌,如果用戶不太可能移動的時候系統(tǒng)會自動暫停位置更新。
大致的意思就是如果這個屬性設(shè)置成YES(默認的也是YES)鸥滨,那么系統(tǒng)會檢測如果設(shè)備有一段時間沒有移動嗦哆,就會自動停掉位置更新服務(wù)谤祖。這里需要注意的是,一旦定位服務(wù)停止了老速,只有當用戶再次開啟App的時候定位服務(wù)才會重新啟動粥喜。
這里的一段時間是系統(tǒng)自動判定的,可以通過設(shè)置activityTypeproperty這個屬性來決定這個時間的長短橘券。
API的意思是额湘,類似導(dǎo)航類的App,系統(tǒng)檢驗的時間會稍長一點,想運動類的App旁舰,就會比導(dǎo)航類的短一點锋华。但是具體時間還是由系統(tǒng)來決定。
- 盡量不要使用startMonitoringSignificantLocationChanges箭窜,優(yōu)先考慮startMonitoringForRegion:
一.代碼層面
1.合理使用NSDateFormatter 和 NSCalendar這種高開銷對象
性能測試表明,NSDateFormatter的性能瓶頸是由于NSDate格式到NSString格式的轉(zhuǎn)化,所以把NSDateFormatter創(chuàng)建單例意義不大.推薦的做法是,把最常用到的日期格式做緩存.
static NSDateFormatter *cachedDateFormatter = nil;
+ (NSDateFormatter *)cachedDateFormatter {
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @“YYYY-MM-dd HH:mm:ss”];
}
return dateFormatter;
}
2.不要頻繁的刷新頁面,能刷新1行cell最好只刷新一行,盡量不要使用reloadData.
3 選擇正確的集合
- NSArray,使用index來查找很快(插入和刪除很慢)
- NSDictionary字典,使用鍵來查找很快
- NSSets,是無序的,用鍵查找很快,插入/刪除很快
4 少用運算獲得圓角,不論view.maskToBounds還是layer.clipToBounds都會有很大的資源開銷,必須要用圓角的話,不如把圖片本身就做成圓角
5 懶加載,不要一次性創(chuàng)建所有的subview,而是需要時才創(chuàng)建.
6 重用
7 圖片處理
- 圖片與imageView相同大小,避免多余運算
- 可以使用整副的圖片,增加應(yīng)用體積,但是節(jié)省CPU
- 可調(diào)大小的圖片,可以省去一些不必要的空間
= CALayer,CoreGraphics,甚至OpenGL來繪制,消耗CPU
8.cache,cache,cache(緩存所有需要的)
- 網(wǎng)絡(luò)請求增加緩存
- 復(fù)雜計算結(jié)果的緩存(UITableView的行高)