• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Тестирование скорости отображения
2page.image=images/cards/card-test-performance_2x.png
3page.keywords=скорость отображения, кадр/с, инструменты
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">Измерение производительности интерфейса</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">Автоматизация тестирования производительности интерфейса</a>
23          <ul>
24            <li><a href="#ui-tests">Настройка тестов интерфейса</a></li>
25            <li><a href="#automated-tests">Настройка автоматизированного тестирования интерфейса</a></li>
26            <li><a href="#triage">Определение и устранение обнаруженных проблем</a></li>
27          </ul>
28        </li>
29      </ol>
30  </div>
31</div>
32
33
34<p>
35  Тестирование производительности интерфейса позволяет убедиться в том, что ваше приложение не только соответствует функциональным требованиям,
36но и гарантирует пользователю безупречное взаимодействие с интерфейсом с постоянной частотой отображения
3760 кадров в секунду (<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&amp;index=25&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">почему именно
3860 кадров/с?</a>), без каких-либо задержек и пропущенных кадров или, как их называют, <em>глюков</em>. В этой
39статье рассматриваются инструменты для измерения производительности интерфейса, а также предлагается подход к
40интеграции этих процедур измерения производительности в ваши методы тестирования приложений.
41</p>
42
43
44<h2 id="measure">Измерение производительности интерфейса</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>
54– это инструмент Android, который запускается на устройстве и создает дамп интересной информации о состоянии системных
55служб. После передачи в dumpsys команды <em>gfxinfo</em> в журнал устройства (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 Preview эта команда фиксирует в 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 Preview представлена новая команда для 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
109кадров, созданных приложением. Ниже приводится пример необработанного результата из журнала adb после выполнения команды dumpsys gfxinfo
110&lt;PACKAGE_NAME&gt; framestats:
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», общее время смены кадра вычислялось путем
139вычитания значения в столбце INTENDED_VSYNC из значения в столбце FRAME_COMPLETED.
140      </li>
141
142      <li>Если это значение не равно нулю, то строку следует пропустить, поскольку кадр был определен как отличающийся от
143обычной производительности, при которой ожидается, что размещение и прорисовка кадра займут
144больше 16 мс. Причина этого может заключаться в следующем:
145        <ul>
146          <li>макет окна был изменен (например, первый кадр приложения или после
147вращения);
148          </li>
149
150          <li>также, возможно, кадр был пропущен, в результате чего временные метки некоторых значений
151содержат бессмысленную информацию; кадр можно пропустить, если, например, скорость отображения превышает 60 кадров/с или если
152на экране от этого не появяются шумы; это не обязательно указывает на проблему
153в приложении.
154          </li>
155        </ul>
156      </li>
157    </ul>
158  </li>
159
160  <li>INTENDED_VSYNC
161    <ul>
162      <li>Предполагаемая начальная точка кадра. Если данное значение отличается от значения в столбце VSYNC, это указывает на то,
163что поток был занят и не смог своевременно среагировать на сигнал
164vsync.
165      </li>
166    </ul>
167  </li>
168
169  <li>VSYNC
170    <ul>
171      <li>Значение времени, которое использовалось во всех приемниках vsync, а также которое было затрачено на прорисовку кадра
172(обратные вызовы кадров Choreographer и анимации, View.getDrawingTime() и т. д.)
173      </li>
174
175      <li>Чтобы узнать подробнее о VSYNC и о том, какое значение это имеет для вашего приложения, просмотрите
176видеоролик,
177<a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=23">посвященный общим сведениям о VSYNC</a>.
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>Однако оно позволяет получить приблизительное представление о том, какая задержка возникает у приложения,
205обратившись к значению разницы (FRAME_COMPLETED - NEWEST_INPUT_EVENT).
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;2 мс), это означает, что приложение затрачивает очень
220много времени на обработку событий ввода, таких как View.onTouchEvent(). В свою очередь, это может указывать на
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 позволяет
234определить, сколько времени потребовалось на оценку всех запущенных аниматоров (ObjectAnimator,
235ViewPropertyAnimator и общих переходов).
236      </li>
237
238      <li>Если разность достаточно велика (&gt;2 мс), проверьте наличие в приложении настраиваемых
239аниматоров, а также то, какие поля анимируют классы ObjectAnimator. Убедитесь, что
240эти поля подходят для анимации.
241      </li>
242
243      <li>Чтобы узнать подробнее о Choreographer, просмотрите видео <a href="https://developers.google.com/events/io/sessions/325418001">For Butter or Worse</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>Чтобы узнать подробнее об этапах разметки и измерения во время рендеринга интерфейса приложения, просмотрите
257видео, посвященное
258<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">аннулированию, макетам и производительности</a>.
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>
274или
275<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">аннулированию, макетам и производительности</a>.
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,4 мс или около этого),
286обычно это указывает на наличие большого количество новых растровых изображений, которые следует передать
287ЦП.
288      </li>
289
290      <li>Чтобы узнать подробнее об этапе синхронизации, просмотрите видео, посвященное
291<a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&amp;index=24&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu">рендерингу профиля с помощью ЦП</a>.
292      </li>
293    </ul>
294  </li>
295
296  <li>ISSUE_DRAW_COMMANDS_START
297    <ul>
298      <li>Время начала отправки аппаратным обработчиком команд на отрисовку для ЦП.
299      </li>
300
301      <li>Разность между этим значением и значением FRAME_COMPLETED позволяет получить приблизительное представление об объеме ресурсов ЦП, используемых
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>Все готово! Общее время, затраченное на обработку этого кадра, вычисленное по следующей формуле:
319FRAME_COMPLETED - INTENDED_VSYNC.
320      </li>
321    </ul>
322  </li>
323
324</ul>
325
326<p>
327  Эти данные можно использовать несколькими способами. Простым, но полезным примером может служить
328график, иллюстрирующий распределение времени кадров (FRAME_COMPLETED - INTENDED_VSYNC) в
329различных диапазонах задержки (см. рисунок ниже). На графике ясно видно, что с большинством кадров
330никаких проблем не возникло (ниже отметки в 16 мс; обозначено красным), однако для некоторых кадров
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  Если в разделе настроек для разработчиков для параметра <strong>Profile GPU rendering</strong> задано значение <strong>In adb shell dumpsys gfxinfo</strong>,
344команда <code>adb shell dumpsys gfxinfo</code> выдает сведения о синхронизации
345по времени для последних 120 кадров. При этом вы увидите несколько категорий значений,
346разделенные знаком табуляции. Эти данные могут оказаться полезными для определения частей конвейера отрисовки, которые могут работать с задержкой
347при высоком уровне обработки.
348</p>
349
350<p>
351  Как и в случае с командой
352<a href="#fs-data-format">framestats</a>, описанной выше, вы можете с легкостью вставить полученные данные в любую программу
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приложения в плане производительности. Дополнительные сведения о
369процессе рендеринга, а также о том, как оптимизировать его, представлены в видео, посвященном
370<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;index=27&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">аннулированию, макетам и производительности</a>.
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производительностью и найти подходящие способы ее устранения. Для этих целей прекрасно
401подходит инструмент <a href="{@docRoot}tools/help/systrace.html">systrace</a>.
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>Частота 60 кадров в секунду
417  </li>
418  <li>Пользовательский интерфейс Android и графический процессор
419  </li>
420  <li>Аннулирование макетов и производительность
421  </li>
422  <li>Анализ производительности интерфейса с помощью systrace
423  </li>
424</ul>
425
426
427<h2 id="automate">Автоматизация тестирования производительности интерфейса</h2>
428
429<p>
430  Один из подходов к тестированию производительности интерфейса заключается в простом привлечении тестировщиков, чтобы они выполнили ряд
431операций с целевым приложением, а также либо просто визуально убедились в отсутствии глюков, либо уделили достаточно много времени
432тестированию приложения с помощью соответствующего инструмента. Однако такой подход имеет один важный недостаток
433– человек физически не способен обрабатывать информацию при очень быстрой смене кадров.
434Кроме того, такая работа занимает много времени, утомляет и не гарантирует полное отсутствие ошибок.
435</p>
436
437<p>
438  Гораздо эффективнее записать ключевые показатели производительности, полученные в ходе автоматического
439тестирования интерфейса, и проанализировать их. В состав Android M Developer Preview входят новые функции ведения журналов, которые позволяют с легкостью
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">Настройка тестов интерфейса</h3>
458
459<p>
460  Прежде чем приступить к автоматизированному тестированию, необходимо принять ряд важных решений,
461чтобы правильно определить область тестирования и ваши требования.
462</p>
463
464<h4>
465  Определение ключевых анимаций или потоков для тестирования
466</h4>
467
468<p>
469  Помните, что плохая производительность чаще всего выражается для пользователей в отсутствии плавной
470анимации. Поэтому при определении того, какие типы действий в пользовательском интерфейсе следует протестировать, полезно
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>Анимации, включающие смешивание альфа-канала
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>Вы только хотите начать отслеживание производительности интерфейса, чтобы получить дополнительные сведения?
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  Производительность приложения может меняться в зависимости от того, на каком устройстве оно установлено. Некоторые устройства могут обладать недостаточным
534объемом памяти, менее производительными графическими процессорами или слабыми ЦП. Это означает, что анимации,
535которые прекрасно работают на устройстве с одним оборудованием, могут вообще не работать на устройстве с другим оборудованием, и, что хуже всего, препятствовать
536нормальной работе другой части конвейера. Поэтому, учитывая такую разницу
537в отображении интерфейса для пользователей, выберите диапазон устройств для выполнения тестов, включив в него
538как современные высокотехнологичные, так и бюджетные устройства, планшеты и т. д. При выборе диапазона устройств учитывайте разницу в производительности ЦП
539, ОЗУ, разрешение экрана, его размер и т. д. Тесты, которые успешно прошли на устройстве верхнего ценового сегмента,
540могут завершиться сбоем на бюджетных моделях.
541</p>
542
543<h4>
544  Базовые средства для тестирования пользовательского интерфейса
545</h4>
546
547<p>
548  Такие наборы инструментов, как <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> и
549<a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a>,
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">Настройка автоматизированного тестирования интерфейса</h3>
564
565<p>
566  Получив возможность протестировать интерфейс, а также настроив конвейер на сбор результатов
567отдельного теста, важно выбрать инструмент, который позволит многократно выполнить
568тест на нескольких устройствах, а также объединить данные о результатах
569тестирования производительности для их дальнейшего анализа вашими специалистами по разработке.
570</p>
571
572<h4>
573  Инструмент для автоматизации тестирования
574</h4>
575
576<p>
577  Следует отметить, что инструменты для тестирования интерфейса (такие как <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a>)
578можно запускать прямо на целевом устройстве или в эмуляторе. Тогда как сбор командой
579<em>dumpsys gfxinfo</em> информации о производительности выполняется на хост-компьютере, который отправляет команды из ADB. Чтобы объединить
580усилия этих двух инструментов, был разработан <a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner</a>.
581Эта система написания сценариев, работающая на хост-компьютере, отправляет команды на
582подключенные устройства, а также получает данные от них.
583</p>
584
585<p>
586  Набор сценариев для надлежащей автоматизации тестирования производительности интерфейса должен включать использование
587системы MonkeyRunner хотя бы для выполнения следующих задач:
588</p>
589
590<ul>
591  <li>загрузка и запуск на целевые устройства или в эмулятор необходимого пакета APK;
592  </li>
593
594  <li>запуск теста UI Automator и его выполнение;
595  </li>
596
597  <li>сбор информации о производительности с помощью <em>dumpsys gfxinfo</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производительность. Если средняя частота кадров для пакета результатов, полученных до изменения, больше значения для пакета, полученного
640после изменения, обычно вы получаете общее повышение производительности в результате этого конкретного
641изменения.
642</p>
643
644<p>
645  При выполнении любого автоматизированного тестирования интерфейса следует учитывать этот момент,
646равно как и любые аномалии, которые могут возникнуть во время теста. Например,
647если производительность вашего приложения неожиданно резко падает из-за проблем с оборудованием устройства (которые
648не вызваны вашим приложением), возможно, вы захотите выполнить пакет повторно, чтобы получить
649менее беспорядочные данные о синхронизации.
650</p>
651
652<p>
653  Итак, сколько раз следует выполнять тест, прежде чем его результаты станут значимыми? Не менее 10!
654 Чем больше раз вы выполняете тест (например, можно сделать 50–100 прогонов), тем выше точность результатов
655(хотя, конечно, ради точности приходится поступаться временем).
656</p>
657