編輯:關於Android編程
最近采用Instruments 來分析整個應用程序的性能.發現很多有意思的點,以及性能優化和一些分析性能消耗的技巧,小結如下。
Instruments使用技巧
關於Instruments官方有一個很有用的用戶使用Guide,當然如果不習慣官方英文可以在這裡找到中文本翻譯版本PDF參閱.Instruments 確實是一個很強大的工具,用它來收集關於一個或多個系統進程的性能和行為的數據極為方便,並能及時跟蹤隨著時間產生的數據.還可以廣泛收集不同類型的數據.關於Instrument工具基本使用不在贅述.如下重點說明一些使用技巧.
1.概覽
工具通過Xcode工具欄中Product->Profile可以啟動,啟動後界面如下:
Instrument概覽[via by chenkai]
當點擊Time Profiler應用程序開始運行後.就能獲取到整個應用程序運行消耗時間分布和百分比.為了保證數據分析在統一使用場景真實行有如下點需要注意:
在開始進行應用程序性能分析的時候,一定要使用真機,模擬器運行在Mac上,然而Mac上的CPU往往比iOS設備要快。相反,Mac上的GPU和iOS設備的完全不一樣,模擬器不得已要在軟件層面(CPU)模擬設備的GPU,這意味著GPU相關的操作在模擬器上運行的更慢,尤其是使用CAEAGLLayer來寫一些OpenGL的代碼時候. 這就導致模擬器性能數據和用戶真機使用性能數據相去甚運.
另外在開始性能分析前另外一件重要的事情是,應用程序運行一定要發布配置 而不是調試配置.
在發布環境打包的時候,編譯器會引入一系列提高性能的優化,例如去掉調試符號或者移除並重新組織代碼.另iOS引入一種"Watch Dog"[看門狗]機制.不同的場景下,“看門狗”會監測應用的性能。如果超出了該場景所規定的運行時間,“看門狗”就會強制終結這個應用的進程.開發者可以crashlog看到對應的日志.但Xcode在調試配置下會禁用"Watch Dog".
2.Time Profiler
選擇Time Profiler啟動.
time profile時間分析工具用來檢測應用CPU的使用情況.可以看到應用程序中各個方法正在消耗CPU時間.使用大量CPU不一定是個問題.類似我們客戶端中不同場景的天氣動畫[類似大雨]的路徑就對CPU依賴就非常高,動畫本身也是非常苛刻且耗費資源較多的任務.
點擊Record 開始運行.
Time Profile 分析界面[via by chenkai]
剛開始我們拿到分析數據時往往是這樣的:
性能數據[via by chenkai]
這裡顯示的是執行代碼完整路徑,其中系統和應用本身一些調用路徑完全揉捏在一起.完全看不到我們關心的應用程序中實際代碼執行耗時和代碼路徑實際所在位置.簡單的方式可以快速勾選右邊Call Tree中Separate Thread和Hide System Libraries兩個選項[後面會解釋選項作用]:
拆分後性能數據[via by chenkai]
可以看到直接能夠看到應用程序各個方法調用耗時直接路徑,剔除掉了系統相關方法和反向調用樹路徑.清爽很多.如果覺得這還不夠直觀,選擇任意一個耗時方法分支[這裡選擇WeatherViewController viewDidLoad]雙擊進入會看到:
代碼&耗時詳情
可以直接定位到viewDidLoad的代碼,也可以直觀的看到改方法下調用其他方法耗時的時間.類似[self loadCityWeatherScroollerView]耗時是121x,x既耗時單位這裡為ms毫秒.當然如果直接在Instrument找到問題覺得不方便修改,可以直接點擊右上方Xcode按鈕會直接定位Xcode對應調用方法入口.這樣很容易能夠快速定位代碼占用CPU最多的方法.也可以打開Xcode快速修改並重新運行Profile來看修改後耗時前後對比.簡單便捷.
這裡對右側call tree選項有必要做一下說明[官方user guide翻譯]:
Separate By Thread:線程分離,只有這樣才能在調用路徑中能夠清晰看到占用CPU最大的線程.
Invert Call Tree:從上到下跟蹤堆棧信息.這個選項可以快捷的看到方法調用路徑最深方法占用CPU耗時,比如FuncA{FunB{FunC}},勾選後堆棧以C->B->A把調用層級最深的C顯示最外面.
Hide Missing Symbols:如果dSYM無法找到你的APP或者調用系統框架的話,那麼表中將看到調用方法名只能看到16進制的數值,勾選這個選項則可以隱藏這些符號,便於簡化分析數據.
Hide System Libraries:這個就更有用了,勾選後耗時調用路徑只會顯示app耗時的代碼,性能分析普遍我們都比較關系自己代碼的耗時而不是系統的.基本是必選項.注意有些代碼耗時也會納入系統層級,可以進行勾選前後前後對執行路徑進行比對會非常有用.
關於其他方法不再贅述.
屏幕使用一個活動來實現,屏幕間是相互獨立的,屏幕之間的跳轉關系通過Intent來實現。屏幕間跳轉分為以下幾類:1. 屏幕1直接跳轉到屏幕2 &nbs
我們有一個TextView,其裡面的內容是可以通過代碼動態改變的,我們想用一張圖片作為TextView的背景,實現類似於手機QQ對話中的氣泡文本效果。TextView定義
本文實例講述了Android獲取手機屏幕大小的方法。分享給大家供大家參考,具體如下:這裡主要用了三個對象TextView ,Button ,以及DisplayMetric
文件上傳可能是一個比較耗時的操作,如果為上傳操作帶上進度提示則可以更好的提高用戶體驗,最後效果如下圖: &nbs