iOS 应用性能测试的相关方法、工具及技巧
用戶不喜歡等待。他們不關心也不應該關心一個應用初始化的時候需要什么,他們只想盡快地完成他們的任務。你的應用應該幾乎是瞬間啟動的,其界面應當如絲般順滑。在充滿競爭的軟件市場中,應用的性能是關鍵的優勢之一。
?
作為開發者,我們也希望對我們辛苦開發的 app 感到自豪。
?
然而,性能優化是一個棘手的問題。大多數的瓶頸是反直覺的。如果沒有合適的度量,找出拖慢 app 的原因是非常困難的。
?
要優化你的 app 的性能,你應該基于數據做決定。在這篇文章中我將會通過度量你的 app 的不同方面的性能,來展示如何得到這個數據。
?
我將談及的方面是:
?
-
CPU,GPU,內存以及 app 的能源消耗;
-
響應性;
-
啟動時間;
-
從你的用戶那里收集的性能指標;
?
讓我們開始吧!
?
CPU,GPU,內存以及能源消耗
?
分析你的 app 的第一個任務,是找出過度使用 CPU, GPU 或者內存的低效代碼。Apple 有一個很棒的工具 Instruments 來完成這個任務:
?
有4個主要的方面需要重點考慮:
?
-
CPU (“Time Profiler” 工具);
-
GPU (“Core Animation” 工具);
-
內存使用 (“Allocations” 工具);
-
電量使用 (“Energy diagnostics” 工具).
?
?
關于使用 Instruments 來分析 app 的最佳信息來源就是 WWDC 視頻。
?
有一些入門的精華:
?
Learning Instruments;
iOS Performance 1, 2, 3;
Improving You App With Instruments;
Advanced Graphics & Animations for iOS Apps;
Profiling In-Depth;
Cocoa Touch Best Practices;
iOS Performance and Power Optimization with Instruments;
Polishing Your App.
?
響應性
?
下一個需要測量的重要的東西是 UI 的響應性。觸摸的處理發生在主線程。主線程有耗時操作的時候,你的 app 變得反應遲鈍。
?
即使有些操作并不使用 CPU,它們也可能會占用時間。如果主線程有同步調用,測量這些調用耗費的時間。
?
要測量這個,你可以使用日志。
?
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
?
// Your method
?
NSUInteger milliseconds = (NSUInteger)((CFAbsoluteTimeGetCurrent() — startTime) * 1000);
?
NSLog(“Done in %lu ms”, milliseconds);
?
Viber 的開發者描述了另一種方法。他們有一個特殊的線程用來監視主線程,并監測主線程的阻塞不會超過 400 毫秒。
?
測試響應性(來自 Viber 關于 NSSpain 的 PPT)
?
測試響應性(來自Viber關于NSSpain的PPT)
?
更多信息請參考 PPT原文 (PDF, 7MB)。
https://dl.dropboxusercontent.com/u/3820193/VbierClientUnderTheHood.pdf
?
使用這個數據來監測耗時太長的調用(400毫秒是一個不錯的閾值,你可以讀一下 這本書 獲取更多信息),然后優化它們或者將其從主線程移出去。
?
啟動時間
?
下一個需要測量的重要的事情是你的app啟動有多快。典型的用戶只會在你的app花費 幾分鐘時間。過長的啟動時間會招致失望。
?
你的app有兩種被啟動的情況:
?
-
冷 啟動:你的 app 的進程沒有在運行,它現在被操作系統啟動。
-
熱 啟動:你的 app 被最小化而沒有殺死。它是從后臺恢復的。
?
本章節主要討論冷啟動,因為這是更加資源密集的操作。
?
下圖是一個 iOS app 的啟動時序。
?
?
The Application Startup Phases (from the documentation) 應用啟動階段(來自這篇文檔)
?
1. 測量啟動花費的總時間
?
我們應當測量從 main() 的開頭到 applicationDidBecomeActive: 末尾之間花費的時間。
?
int main(int argc, char * argv[]) {
?
????// Save the initial time for startup
????[[StartipTimeMonitor sharedMonitor] appWillStartLoading];
?
????@autoreleasepool {
????????return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
????}
}
?
- (void)applicationDidBecomeActive:(UIApplication *)application {
??// Your code
?
??// We assume that the app is loaded then the main thread become free
??// after this callback is finished.
??dispatch_async(dispatch_get_main_queue(), ^{
????[[StartipTimeMonitor sharedMonitor] appDidFinishLoading];
??});
}
?
當你引入新特性的時候,確保啟動時間不會變得更糟。試著將冷啟動時間控制在 1 秒以內。
?
2. 測量啟動時序階段的時間
?
通常來說,只知道啟動消耗的總時間是不夠的。搞清楚啟動時序中的哪個階段拖慢了啟動也很重要。
?
要考慮的最重要的階段是:
?
-
-[AppDelegate application:didFinishLaunchingWithOptions:]?—?當啟動圖(或故事板)顯示的時候這個回調被調起。當你的 app從這個方法返回的時候,實際的UI立刻開始加載。
-
-[UIViewController loadView] — 如果你的app加載一個自定義的 view,這里是 view 初始化的地方。
-
-[UIViewController viewDidLoad]?— view 已經被加載;最終的初始化的時間。
-
-[AppDelegate applicationDidBecomeActive:]— UI 已經被初始化,但是在這個
-
回調完成之前UI仍舊被阻塞著。當你的 app 從后臺被恢復時,這個方法也會被調用。
?
如果這些方法中的某些占用了過多的時間,優化它。
?
3. 測量“壓力下”的啟動時間
?
真實世界與典型的測試環境相比有一個重要的不同。
?
你的 app 在真實世界不是孤立存在的。
?
用戶常常從另一個 app 切換到你的 app。這個“另一個 app”可能非常笨重。因此測量這些情景下的啟動時間非常重要,那就是:你的 app 開始啟動的同時,另一個笨重的 app 正在切換到后臺,并試圖保存它的數據。
?
那樣的測試可以發現一些意想不到的結果。先前完全無害的代碼,在那種情境下可能會顯著地拖慢你的 app。
?
4. app 已經啟動,但仍然不可用
?
如果你的 app 在已經加載完UI之后并不是立即可用,那么它并沒有真正地完成加載。即使 UI 已經加載完畢并且有響應,但仍需要加載一些數據才能準備就緒,把這也算到啟動階段去。
?
從你的用戶那里收集的性能指標
?
前述的所有測量方法在測試環境都可以使用。這些是必須的,但是并不高效。如果你的 app 很流行,如果你的用戶群遍布全球,一些用戶的環境可能跟你預期中的相差巨大。
?
他們可能有不同的:
?
-
網絡狀況;
-
硬件;
-
軟件(操作系統版本,越獄……);
-
設備上的可用空間
-
其他種種
?
他們也可能有不同的 app 使用方式。
?
即使你在實驗環境中測試的所有指標都處在安全區間,你仍有可能得到帶著抱怨的一星評價(“你的 app 太慢!”)。
?
對此應該做些什么呢?
?
定義一套性能指標(或 KPI),并從真實用戶那里收集數據。你可以利用幾乎任意的分析程序包來做這件事。
?
下面是你可以從用戶那里得到的 KPI 的例子:
?
總的冷啟動時間。
總的熱啟動時間。
啟動階段的啟動時間。
從服務器下載必要數據花費的時間。
主線程阻塞超過400毫秒的次數。
內存警告的次數。
FOOMS 的數量。
UI 阻塞或不可用時操作的長度。
?
分析程序包將允許你把這些值以及設備類型、國家或網絡運營商一起,分散存儲到片段中。這些可能會讓你洞悉用戶遇到了什么樣的性能問題,以及如何修復它。
?
結論
?
正如你看到的一樣,性能度量不僅僅是運行 Instruments.app。還有其它有價值的地方值得考慮。
?
上述的一些方法實現起來簡單快捷,另外一些則要求更多的時間和精力。然而,它們將幫助你監控你的app的性能,找出并解決問題,使你的app用起來更加有趣。
?
轉載于:https://www.cnblogs.com/fengmin/p/5500391.html
總結
以上是生活随笔為你收集整理的iOS 应用性能测试的相关方法、工具及技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一起来学习android自定义控件3——
- 下一篇: 原创:三星堆文化比中原文化先进,真的比夏