Stopwatch工具類

語言: CN / TW / HK

現在我的一部分工作就是優化客戶端的效能,比如優化列表快速滑動卡頓現象。

一個很好的辦法就是使用DDMS的Method Profiling功能,它可以生成一個表格來顯示app中所有執行的方法的執行時間,佔cpu執行的百分比,還有圖形化的顯示。功能很強大!

但是,有的時候是跨執行緒工作的,比如,我獲得要傳送一個http請求到http請求返回時的時間,這個它就無能為力了(或許可能我沒有發現這個功能);還比如,我要獲得從sd卡上讀一個檔案所需的時間。

一個最原始的方法就是

long start = SystemClock.uptimeMillis();
//do something
Log.i(TAG, "time: " + (SystemClock.uptimeMillis() - start));

這樣就可以獲得這段程式碼的執行時間了,我發現在測試Adapter的 getView 方法效能時很管用。因為ListView快速滑動時卡頓最主要的原因就是 getView 方法執行時間過長,我的測試過程中發現 getView 方法的執行時間不能超過10ms(當然這個在不同手機上執行時間不一樣)。也就是如果在一個手機上 getView 方法執行時間超過10ms,這個列表快速滑動時就會產生卡頓現象。

但是Adapter中可能有很多方法,我要在每個方法中都像上面那樣寫麼?我不要煩死了?

然後,我就從秒錶中獲得啟發,我可不可以也像秒錶一樣寫一個類來對每個方法測試它的執行時間呢?

下面這個類就誕生了,其實這個類很簡單,你只需要在你需要測試時間的方法A前寫一句:

StopWatch.begin("bxbxbai");

這就相當於按了一下秒錶(StopWatch工具就是在HashMap中添加了一條記錄),然後在方法A後面寫一句:

StopWatch.end("bxbxbai");

這就相當於按了一下秒錶,系統在Log中輸出了方法A的的執行時間,並且把tag刪除。

StopWatch.lap("bxbxbai");

這個方法不會刪除tag,它會輸出當前時間到打tag的時候的時間間隔,就是秒錶的計次功能。

不光如此,這個類還支援跨程序,比如,我在A執行緒中執行begin方法,我可以在一個Callback中執行end方法,輸出總共的執行時間。