• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=測試顯示效能
2page.image=images/cards/card-test-performance_2x.png
3page.keywords=效能, fps, 工具
4
5@jd:body
6
7
8<div id="qv-wrapper">
9  <div id="qv">
10    <h2>本文件內容</h2>
11      <ol>
12        <li><a href="#measure">測量 UI 效能</a>
13          <ul>
14            <li><a href="#aggregate">彙總畫面統計資料</a></li>
15            <li><a href="#timing-info">精確畫面計時資訊</a></li>
16            <li><a href="#timing-dump">簡易畫面計時傾印</a></li>
17            <li><a href="#collection-window">控制統計資料收集時間</a></li>
18            <li><a href="#diagnose">診斷效能回復</a></li>
19            <li><a href="#resources">其他資源</a></li>
20          </ul>
21        </li>
22        <li><a href="#automate">自動化 UI 效能測試</a>
23          <ul>
24            <li><a href="#ui-tests">設定 UI 測試</a></li>
25            <li><a href="#automated-tests">設定自動化 UI 測試</a></li>
26            <li><a href="#triage">分類和修正觀察到的問題</a></li>
27          </ul>
28        </li>
29      </ol>
30  </div>
31</div>
32
33
34<p>
35  使用者介面效能測試可確保您的應用程式不只符合功能需求,與使用者與應用程式的互動也無比順暢,執行時每秒一致有 60 個畫面 (<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&amp;index=25&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">為什麼 60fps?</a>),任何畫面都不會遺漏或延遲,或稱為「閃避」<em></em>現象。
36
37
38本文件說明可用以測量 UI 效能的工具,以及呈現可將 UI 效能測量與測試做法整合的方法。
39
40
41</p>
42
43
44<h2 id="measure">測量 UI 效能</h2>
45
46<p>
47  為改善效能,首先您需要測量系統效能的能力,接著在管道的各部分發生問題時加以診斷和辨識。
48
49
50</p>
51
52<p>
53  <em><a href="https://source.android.com/devices/tech/debug/dumpsys.html">dumpsys</a></em> 是一種 Android 工具,可在裝置上執行和傾印有關系統服務狀態的有趣資訊。
54
55將 <em>gfxinfo</em> 命令傳送至 dumpsys,會將錄製階段所發生與動畫的畫面相關的效能資訊以 logcat 提供輸出。
56
57
58</p>
59
60<pre>
61&gt; adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt;
62</pre>
63
64<p>
65  此命令會產生多種不同的畫面計時資料。
66</p>
67
68<h3 id="aggregate">彙總畫面統計資料</h3>
69
70<p>
71  使用 M 預覽版,命令會在程序的生命週期全程收集畫面資料,並將彙總的分析列印到 logcat。
72例如:
73</p>
74
75<pre class="noprettyprint">
76Stats since: 752958278148ns
77Total frames rendered: 82189
78Janky frames: 35335 (42.99%)
7990th percentile: 34ms
8095th percentile: 42ms
8199th percentile: 69ms
82Number Missed Vsync: 4706
83Number High input latency: 142
84Number Slow UI thread: 17270
85Number Slow bitmap uploads: 1542
86Number Slow draw: 23342
87</pre>
88
89<p>
90  這些高階統計資料是以高階方式轉換應用程式的轉譯效能,還有其在許多畫面的穩定性。
91
92</p>
93
94
95<h3 id="timing-info">精確畫面計時資訊</h3>
96
97<p>
98  M 預覽版隨附新的命令 gfxinfo,而 <em>framestats</em> 可從最近的畫面提供相當詳細的畫面計時資訊,讓您可以追蹤並更準確進行除錯。
99
100
101</p>
102
103<pre>
104&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; framestats
105</pre>
106
107<p>
108  此命令會從應用程式所產生至少 120 個畫面當中,加上奈秒時間戳記印出畫面計時資訊。以下範例是 adb dumpsys gfxinfo &lt;PACKAGE_NAME&gt; framestats 的原始輸出:
109
110
111</p>
112
113<pre class="noprettyprint">
1140,49762224585003,49762241251670,9223372036854775807,0,49762257627204,49762257646058,49762257969704,49762258002100,49762265541631,49762273951162,49762300914808,49762303675954,
1150,49762445152142,49762445152142,9223372036854775807,0,49762446678818,49762446705589,49762447268818,49762447388037,49762453551527,49762457134131,49762474889027,49762476150120,
1160,49762462118845,49762462118845,9223372036854775807,0,49762462595381,49762462619287,49762462919964,49762462968454,49762476194547,49762476483454,49762480214964,49762480911527,
1170,49762479085548,49762479085548,9223372036854775807,0,49762480066370,49762480099339,49762481013089,49762481085850,49762482232152,49762482478350,49762485657620,49762486116683,
118</pre>
119
120<p>
121  這裡的每一行輸出都代表應用程式產生的一個畫面。每行都有固定的資料欄編號,描述畫面產生管道的各階段所花費的時間。
122下一節會詳細說明此格式,包括各資料欄代表的意義。
123
124</p>
125
126
127<h4 id="fs-data-format">Framestats 資料格式</h4>
128
129<p>
130  由於資料區塊是以 CSV 格式輸出,所以可以直接將它貼到選擇的試算表工具,或使用指令碼來收集和剖析。
131下表說明輸出資料欄的格式。
132所有時間戳記都以奈秒為單位。
133</p>
134
135<ul>
136  <li>FLAGS
137    <ul>
138      <li>FLAGS 資料欄的資料列均為 0,從 FRAME_COMPLETED 資料欄減去 INTENDED_VSYNC 資料欄可計算得出總畫面時間。
139
140      </li>
141
142      <li>如果這個值非零,應該略過該資料列,因為從正常效能來判斷,畫面已是極端值,版面配置與繪製預期都要花費 16ms 以上的時間。
143
144以下是發生這種情況的幾個原因:
145        <ul>
146          <li>視窗版面配置改變 (例如應用程式的第一個畫面或經過旋轉)
147
148          </li>
149
150          <li>也可能是略過畫面,在這種情況下,某些值會含有記憶體回收的時間戳記。
151例如,如果畫面速度超過 60fps,或如果螢幕上空無一物,最後卻有所改變,就可能會略過畫面,這不一定是應用程式發生問題的徵兆。
152
153
154          </li>
155        </ul>
156      </li>
157    </ul>
158  </li>
159
160  <li>INTENDED_VSYNC
161    <ul>
162      <li>預期的畫面起始點。如果這個值和VSYNC 不同,表示 UI 執行緒中發生的工作使它無法即時回應 vsync 訊號。
163
164
165      </li>
166    </ul>
167  </li>
168
169  <li>VSYNC
170    <ul>
171      <li>用於所有 vsync 接聽器和繪製畫面的時間值 (Choreographer 畫面回呼、動畫、View.getDrawingTime() 等等)
172
173      </li>
174
175      <li>如要深入瞭解有關 VSYNC 和它如何影響您的應用程式,請參閱<a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=23">瞭解 VSYNC</a> 影片。
176
177
178      </li>
179    </ul>
180  </li>
181
182  <li>OLDEST_INPUT_EVENT
183    <ul>
184      <li>輸入佇列中最舊輸入事件的時間戳記,或為 Long.MAX_VALUE,若沒有該畫面的輸入事件的話。
185
186      </li>
187
188      <li>這個值主要用於平台工作,對應用程式開發人員用處不大。
189
190      </li>
191    </ul>
192  </li>
193
194  <li>NEWEST_INPUT_EVENT
195    <ul>
196      <li>輸入佇列中最新輸入事件的時間戳記,或為 0,若沒有該畫面的輸入事件的話。
197
198      </li>
199
200      <li>這個值主要用於平台工作,對應用程式開發人員用處不大。
201
202      </li>
203
204      <li>不過,透過查看 (FRAME_COMPLETED - NEWEST_INPUT_EVENT),可以大略知道應用程式還會延遲多少時間。
205
206      </li>
207    </ul>
208  </li>
209
210  <li>HANDLE_INPUT_START
211    <ul>
212      <li>將輸入事件分配給應用程式時的時間戳記。
213      </li>
214
215      <li>查看這個值與 ANIMATION_START 之間的時間,即可測量出應用程式花費在處理輸入事件的時間。
216
217      </li>
218
219      <li>如果這個數字很高 (&gt;2ms),這表示應用程式花費在處理輸入事件(例如 View.onTouchEvent()) 的時間過長,指出需要將這項工作最佳化,或卸載交由其他執行緒處理。
220
221請注意,還有一些情況本就預期且可接受這個數字較大,例如會啟動新活動或類似工作的點擊事件。
222
223
224      </li>
225    </ul>
226  </li>
227
228  <li>ANIMATION_START
229    <ul>
230      <li>向 Choreographer 註冊的動畫執行時的時間戳記。
231      </li>
232
233      <li>查看這個值與 PERFORM_TRANVERSALS_START 之間的時間,即可判斷它花費多久的時間評估所有執行中的動畫器 (常見的有 ObjectAnimator、ViewPropertyAnimator 及 Transitions)。
234
235
236      </li>
237
238      <li>如果這個數字很高 (&gt;2ms),可查看您的應用程式是否撰寫任何自訂動畫器,或 ObjectAnimators 正進行動畫處理的資料欄,並確定它們都適用於動畫。
239
240
241      </li>
242
243      <li>如要深入瞭解 Choreographer,請參閱<a href="https://developers.google.com/events/io/sessions/325418001">順滑流暢與否</a>影片。
244
245      </li>
246    </ul>
247  </li>
248
249  <li>PERFORM_TRAVERSALS_START
250    <ul>
251      <li>如果您從這個值中減去 DRAW_START,就可以得知版面配置和測量階段花費多久的時間完成。(請注意,在捲動或動畫期間,您會希望這個值趨近於零。)
252
253
254      </li>
255
256      <li>如要深入瞭解轉譯管道的測量與版面配置階段,請參閱<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">無效判定、版面配置及效能</a>影片。
257
258
259      </li>
260    </ul>
261  </li>
262
263  <li>DRAW_START
264    <ul>
265      <li>performTraversals 的繪製階段開始的時間。這是判定無效的任何檢視顯示清單的記錄起始點。
266
267      </li>
268
269      <li>這個值與 SYNC_START 之間的時間,就是對樹狀結構中所有無效判定檢視呼叫 View.draw() 所花費的時間。
270
271      </li>
272
273      <li>如需繪製模型的詳細資訊,請參閱<a href="{@docRoot}guide/topics/graphics/hardware-accel.html#hardware-model">硬體加速</a>或<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">無效判定、版面配置及效能</a>影片。
274
275
276      </li>
277    </ul>
278  </li>
279
280  <li>SYNC_START
281    <ul>
282      <li>繪製的同步階段開始的時間。
283      </li>
284
285      <li>如果這個值與 ISSUE_DRAW_COMMANDS_START 之間的時間相當長 (約為 &gt;0.4ms ),通常代表已繪製許多必須上傳至 GPU 的新點陣圖。
286
287
288      </li>
289
290      <li>如要深入瞭解同步階段,請參閱<a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&amp;index=24&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu">設定檔 GPU 轉譯</a>影片。
291
292      </li>
293    </ul>
294  </li>
295
296  <li>ISSUE_DRAW_COMMANDS_START
297    <ul>
298      <li>硬體轉譯器開始對 GPU 發出繪製命令的時間。
299      </li>
300
301      <li>這個值與 FRAME_COMPLETED 之間的時間大約就是應用程式產生的 GPU 工作量。
302太過度繪製或無效轉譯效果之類的問題都會顯示於此。
303
304      </li>
305    </ul>
306  </li>
307
308  <li>SWAP_BUFFERS
309    <ul>
310      <li>相對於無趣的平台工作以外,呼叫 eglSwapBuffers 的時間。
311
312      </li>
313    </ul>
314  </li>
315
316  <li>FRAME_COMPLETED
317    <ul>
318      <li>全部完成!花費在處理這個畫面的總時間,計算方法是 FRAME_COMPLETED - INTENDED_VSYNC。
319
320      </li>
321    </ul>
322  </li>
323
324</ul>
325
326<p>
327  您能以不同的方式使用這項資料。顯示不同延遲貯體中畫面時間分布的長條圖就是一種簡單但實用的方式,請見下圖。
328
329本圖可一目瞭然地告訴我們,大部分畫面都低於 16ms 的上限 (紅色除外),但只有幾個畫面明顯超過上限。
330
331我們可以查看此長條圖一段時間的變化,觀察出現的大規模位移或產生新的極端值。
332您也能根據資料中的許多時間戳記將輸入延遲、花費在版面配置的時間或其他類似的有趣度量指標繪成圖表。
333
334
335</p>
336
337<img src="{@docRoot}preview/images/perf-test-framestats.png">
338
339
340<h3 id="timing-dump">簡易畫面計時傾印</h3>
341
342<p>
343  如果 [開發人員選項] 中的 [設定檔 GPU 轉譯]<strong></strong> 設定為 [In adb shell dumpsys gfxinfo]<strong></strong>
344,<code>adb shell dumpsys gfxinfo</code> 命令會印出最近 120 個畫面的計時資訊,以定位鍵分隔值分成數個不同類別。
345
346這項資料非常適合用來指出可能是繪製管道的哪個部分太慢。
347
348</p>
349
350<p>
351  類似於上述的 <a href="#fs-data-format">framestats</a>,可以直接將它貼到選擇的試算表工具,或使用指令碼來收集和剖析。
352
353下圖顯示許多由應用程式產生的畫面花費時間的分類細項。
354
355</p>
356
357<img src="{@docRoot}preview/images/perf-test-frame-latency.png">
358
359<p>
360  執行 gfxinfo、複製輸出、將輸出貼入試算表應用程式,然後將資料繪製成堆疊長條圖的結果。
361
362</p>
363
364<p>
365  每個直條都代表動畫的一個畫面,其高度代表計算該畫面所花費的毫秒數。
366長條的每個色塊都代表轉譯管道的不同階段,好讓您看出應用程式的哪部分可能產生瓶頸。
367
368如需瞭解繪製管道以及如何最佳化的詳細資訊,請參閱硬體加速或<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;index=27&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">無效判定、版面配置及效能</a>影片。
369
370
371</p>
372
373
374<h3 id="collection-window">控制統計資料收集時間</h3>
375
376<p>
377  framestats 與簡單的畫面計時都會收集極短時間內的資料 – 轉譯約需兩秒。
378為了精確控制這段時間,例如只限特定動畫的資料,您可以重設所有計數器,然後彙總收集的統計資料。
379
380
381</p>
382
383<pre>
384&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; reset
385</pre>
386
387<p>
388  這也能和傾印命令本身結合使用,定期收集和重設,持續擷取兩秒時間內的畫面。
389
390
391</p>
392
393
394<h3 id="diagnose">診斷效能回復</h3>
395
396<p>
397  識別回復是追蹤問題和維護應用程式健康情況的第一步。
398不過,dumpsys 只能識別有問題存在與相關的嚴重性。
399您仍需要診斷造成效能問題的特定原因,以及找出適當的修正方式。
400因此,強烈建議您使用 <a href="{@docRoot}tools/help/systrace.html">systrace</a> 工具。
401
402</p>
403
404
405<h3 id="resources">其他資源</h3>
406
407<p>
408  如需 Android 的轉譯管道如何運作、常見問題以及如何修正的詳細資訊,下列的一些資訊可能會很實用:
409
410
411</p>
412
413<ul>
414  <li>轉譯效能 101
415  </li>
416  <li>為什麼 60fps?
417  </li>
418  <li>Android UI 和 GPU
419  </li>
420  <li>無效判定、版面配置及效能
421  </li>
422  <li>利用 Systrace 分析 UI 效能
423  </li>
424</ul>
425
426
427<h2 id="automate">自動化 UI 效能測試</h2>
428
429<p>
430  UI 效能測試的方法之一就是讓測試人員對目標應用程式執行一組使用者操作,並以肉眼查看,或花費很長一段時間使用工具導向的方法,尋找閃避現象。
431
432但這種靠人工的方式充滿危險,人類對畫面率變化的感知能力因人而異,而且這種方法也很費時、繁瑣且容易出錯。
433
434
435</p>
436
437<p>
438  較有效率的方法是從自動化的 UI 測試中記錄和分析重要效能度量指標。
439Android M 開發人員預覽版包含新的記錄功能,能夠輕鬆判斷應用程式動畫中閃避現象的數量與嚴重程度,還能用來建置嚴謹的程序,判斷目前的效能並追蹤未來的效能目標。
440
441
442
443</p>
444
445<p>
446  本文會逐步說明建議用來使用資料以自動化效能測試的方法。
447
448</p>
449
450<p>
451  這種方法大多分成兩個主要動作。首先,識別您要測試的項目,以及測試的方法。其次是設定和維護自動化測試環境。
452
453
454</p>
455
456
457<h3 id="ui-tests">設定 UI 測試</h3>
458
459<p>
460  在您開始進行自動化測試之前,務必要決定幾個高階決策,才能適當瞭解您的測試空間與可能會有的需求。
461
462</p>
463
464<h4>
465  識別要測試的主要動畫 / 流程
466</h4>
467
468<p>
469  請記住,流暢的動畫有所中斷時,就是使用者最容易看見效能低落的時候。
470因此,識別要測試哪種類型的 UI 動作時,最好著重在使用者最常看見或對他們的體驗最重要的主要動畫。
471
472例如,以下是一些可能有利於識別的常見情況:
473</p>
474
475<ul>
476  <li>捲動主要的 ListView 或 RecyclerView
477  </li>
478
479  <li>非同步等待週期內的動畫
480  </li>
481
482  <li>當中會載入 / 操縱點陣圖的任何動畫
483  </li>
484
485  <li>包含 Alpha 透明混色的動畫
486  </li>
487
488  <li>使用畫布繪製的自訂檢視
489  </li>
490</ul>
491
492<p>
493  和您團隊的工程人員、設計師及產品經理合作,優先考慮將這些主要產品動畫放入測試涵蓋範圍內。
494
495</p>
496
497<h4>
498  定義未來目標並予以追蹤
499</h4>
500
501<p>
502  從高階觀點來看,重要的是識別特定的效能目標,並著重在撰寫測試及收集相關資料。
503例如:
504</p>
505
506<ul>
507  <li>您是否只想初次開始追蹤 UI 效能以深入瞭解?
508  </li>
509
510  <li>您是否想要避免可能在未來導入的回復?
511  </li>
512
513  <li>今日有 90% 的順暢畫面並想要在本季達到 98%?
514  </li>
515
516  <li>今日有 98% 的順暢畫面且不想要回復?
517  </li>
518
519  <li>您的目標是改善低階裝置上的效能嗎?
520  </li>
521</ul>
522
523<p>
524  在上述的這些情況中,您會想要有歷史追蹤功能,來顯示不同應用程式版本間的效能。
525
526</p>
527
528<h4>
529  識別測試要用的裝置
530</h4>
531
532<p>
533  應用程式效能會因其執行所在裝置而異。有些裝置包含的記憶體較少、GPU 較不強大或 CPU 晶片速度較慢。
534這表示可在某組硬體上執行良好的動畫,在其他組合上不一定能執行良好,更糟的是可能會在管道的不同部分產生瓶頸。
535
536使用者所見可能會不同,為將這點列入考量,請挑選涵蓋當前高階裝置、低階裝置、平板電腦等的一系列裝置執行測試。
537
538尋找 CPU 效能、RAM、畫面密度、大小等方面的變化。
539高階裝置上通過的測試,在低階裝置上可能會失敗。
540
541</p>
542
543<h4>
544  UI 測試的基本架構
545</h4>
546
547<p>
548  工具套件 (例如 <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> 和 <a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a>) 是為協助將使用者在您的應用程式四處移動的動作自動化而建置。
549
550這些都是模擬使用者與裝置互動的簡單架構。
551如要使用這些架構,您要有效地建立會逐一執行一組使用者動作的獨特指令碼,然後在裝置上自行播放。
552
553
554</p>
555
556<p>
557  連同 <code>dumpsys gfxinfo</code>,再結合這些自動化測試,您可快速建立可重現系統,讓您執行測試並測量該特定情況下的效能資訊。
558
559
560</p>
561
562
563<h3 id="automated-tests">設定自動化 UI 測試</h3>
564
565<p>
566  在您能夠執行 UI 測試,還有可從單一測試收集資料的管道後,下一個重要步驟是利用可多次執行該項測試的架構,然後彙總產生的效能資料,以供您的開發團隊進一步分析。
567
568
569
570</p>
571
572<h4>
573  測試自動化的架構
574</h4>
575
576<p>
577  直接在目標裝置/模擬器上執行的 UI 測試架構 (例如 <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a>) 毫無價值。
578因為效能收集資訊是由主控機器透過 ADB 傳送命令驅動 <em>dumpsys gfxinfo</em> 來完成。
579<a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner</a> 架構是為了協助橋接這些個別實體開發。在主控機器上執行的指令碼處理系統可對一組連接的裝置發出命令,也能接收來自這些裝置的資料。
580
581
582
583</p>
584
585<p>
586  建置一組指令碼以適當自動化 UI 效能測試,至少應能利用 monkeyRunner 來完成下列工作:
587
588</p>
589
590<ul>
591  <li>對目標裝置或模擬器載入和啟動所需的 APK。
592  </li>
593
594  <li>啟動並允許執行 UI Automator UI 測試
595  </li>
596
597  <li>透過 dumpsys gfxinfo 收集效能資訊。<em></em><em></em>
598  </li>
599
600  <li>彙總資訊並以對開發人員有用的方式顯示。
601  </li>
602</ul>
603
604
605<h3 id="triage">分類和修正觀察到的問題</h3>
606
607<p>
608  在辨識出問題模式與回復之後,下一個步驟是辨識和套用修正。
609如果您的自動化測試架構會為畫面保留精確的計時分類細項,可幫助您詳細審察目前可疑的程式碼/版面配置變化 (在回復的情況下),或在您切換為靠人工探究時縮小要分析的系統部分。
610
611
612如需靠人工探究時,<a href="{@docRoot}tools/help/systrace.html">systrace</a> 是開始進行的好地方,顯示轉譯管道各階段、系統中每個執行緒與核心,還有您所定義任何自訂事件標記的精確計時資訊。
613
614
615</p>
616
617<h4>
618  適當分析暫時的計時
619</h4>
620
621<p>
622  請務必注意,從轉譯效能中取得和測量計時的困難度。
623這些數字不具決定性且通常受系統狀態、可用記憶體數目、溫度調節,還有上次太陽閃焰何時衝擊您所在地區影響。
624
625重點是您執行相同的測試兩次,而每次得到的數字都有些微不同,數字很接近但不會完全相同。
626
627
628</p>
629
630<p>
631  以這種方式適當收集和分析資料,表示執行相同的測試多次,並累積結果取平均值或中間值。(為了簡單起見,我們稱之為「批次」) 這可讓您粗略計算測試的效能,而不需要精確的計時。
632
633
634
635</p>
636
637<p>
638  在變更的程式碼之間使用批次,可看出那些變更對效能的影響。
639如果前次變更批次的平均畫面率大於後來變更批次,您通常會有那項特定變更的整體 win wrt 效能。
640
641
642</p>
643
644<p>
645  這表示您執行的任何自動化 UI 測試都應將此概念列入考量,同時考量可能會在測試期間發生的任何異常情況。
646例如,您的應用程式效能若因為某些裝置問題而突然下降 (並非由您的應用程式引起),您可能會想要重新執行批次,以讓取得的計時較不混亂。
647
648
649
650</p>
651
652<p>
653  應該執行多少次測試才能獲得有意義的測量結果呢?最少應執行 10 次,若執行更多次 (像是 50 或 100 次) 可以產生更準確的結果 (當然您現在是以時間換取準確度)。
654
655
656</p>
657