1page.title=Prueba de rendimiento de video
2page.image=images/cards/card-test-performance_2x.png
3page.keywords=rendimiento, fotogramas por segundo, herramientas
4
5@jd:body
6
7
8<div id="qv-wrapper">
9  <div id="qv">
10    <h2>Contenido del documento</h2>
11      <ol>
12        <li><a href="#measure">Medición del rendimiento de la UI</a>
13          <ul>
14            <li><a href="#aggregate">Incorporación de Frame Stats</a></li>
15            <li><a href="#timing-info">Información precisa del intervalo del fotograma</a></li>
16            <li><a href="#timing-dump">Volcado simple del intervalo del fotograma</a></li>
17            <li><a href="#collection-window">Control del período de recopilación de datos</a></li>
18            <li><a href="#diagnose">Diagnóstico de regresiones de rendimiento</a></li>
19            <li><a href="#resources">Recursos adicionales</a></li>
20          </ul>
21        </li>
22        <li><a href="#automate">Automatización de las pruebas de rendimiento de la UI</a>
23          <ul>
24            <li><a href="#ui-tests">Configuración de las pruebas de UI</a></li>
25            <li><a href="#automated-tests">Configuración de las pruebas automatizadas de UI</a></li>
26            <li><a href="#triage">Clasificación y solución de problemas detectados</a></li>
27          </ul>
28        </li>
29      </ol>
30  </div>
31</div>
32
33
34<p>
35  La prueba de rendimiento de la UI le garantiza que su aplicación no solo cumpla con los requisitos funcionales sino que la interacción del usuario con su aplicación sea fluida y funcione constantemente a 60 fotogramas por segundo (<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&amp;index=25&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">Why 60fps?</a>) sin disminuir o retrasar fotogramas (lo que llamamos <em>“jank”</em>).
36
37
38 Este documento explica las herramientas disponibles para medir el rendimiento de la UI y establece un enfoque para integrar las medidas de rendimiento de la UI en sus prácticas de prueba.
39
40
41</p>
42
43
44<h2 id="measure">Medición del rendimiento de la UI</h2>
45
46<p>
47  Para mejorar el rendimiento, primero necesita poder medir el rendimiento de su sistema y, luego, diagnosticar e identificar los problemas que puedan surgir debido a las varias secciones de su canalización.
48
49
50</p>
51
52<p>
53  <em><a href="https://source.android.com/devices/tech/debug/dumpsys.html">dumpsys</a></em> es una herramienta de Android que se ejecuta en el dispositivo y vuelca información útil sobre el estado de los servicios del sistema.
54
55 Al pasar el comando <em>gxinfo</em> a dumsys, se obtiene una salida de logcat con información de rendimiento en relación con los fotogramas de animación que ocurren durante la fase de grabado.
56
57
58</p>
59
60<pre>
61&gt; adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt;
62</pre>
63
64<p>
65  Este comando puede crear múltiples variantes diferentes de datos del intervalo del fotograma.
66</p>
67
68<h3 id="aggregate">Incorporación de Frame Stats</h3>
69
70<p>
71  En la versión preliminar de Android M, el comando emite un análisis adicional a logcat sobre los datos del fotograma. Estos datos se recopilan en toda la duración del proceso.
72 Por ejemplo:
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  Estas estadísticas de alto nivel representan, en un nivel avanzado, el rendimiento de representación de la aplicación y su estabilidad en muchos fotogramas.
91
92</p>
93
94
95<h3 id="timing-info">Información precisa del intervalo del fotograma</h3>
96
97<p>
98  La versión preliminar de Android M ofrece un nuevo comando para gfxinfo, es <em>framestats</em> que brinda información extremadamente detallada sobre el intervalo del fotograma reciente, de manera que usted puede localizar y depurar errores de manera más precisa.
99
100
101</p>
102
103<pre>
104&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; framestats
105</pre>
106
107<p>
108  Este comando emite información sobre el intervalo del fotograma, medida en nanosegundos, de los últimos 120 fotogramas que produjo la aplicación. A continuación, se muestra un ejemplo sin formato de adb dumpsys gxinfo &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  Cada línea de esta salida representa un fotograma producido por la aplicación. Cada línea tiene un número fijo de columnas que describen el tiempo transcurrido en cada etapa de la canalización de producción de fotogramas.
122 En la siguiente sección, se describe este formato en detalle y se explica qué representa cada columna.
123
124</p>
125
126
127<h4 id="fs-data-format">Formato de datos de framestats</h4>
128
129<p>
130  Debido a que el bloque de datos se emite en formato CSV, es muy sencillo pegarlo en su herramienta de hoja de cálculo preferida, o recopilar y redistribuir con un script.
131 La siguiente tabla explica el formato de las columnas de los datos de salida.
132 Las marcas de tiempo están en nanosegundos.
133</p>
134
135<ul>
136  <li>FLAGS
137    <ul>
138      <li>El tiempo total del fotograma de las filas con “0” en la columna FLAGS se puede calcular restando la columna INTENDED_VSYNC a la columna FRAME_COMPLETED.
139
140      </li>
141
142      <li>Si el resultado no es cero, la fila se debe ignorar, ya que se ha determinado que el fotograma contiene un valor atípico de rendimiento, donde se espera que el diseño y la imagen tomen más de 16 ms.
143
144 Razones por las que esto puede suceder:
145        <ul>
146          <li>Se cambió el diseño de la ventana (ya sea el primer fotograma de la aplicación o luego de una rotación)
147
148          </li>
149
150          <li>También es posible que se haya omitido el fotograma. En ese caso, alguno de los valores tendrán marcas de tiempo no utilizables.
151 Se puede omitir un fotograma si, por ejemplo, supera los 60 fotogramas por segundo o si no había nada desfasado en pantalla. Esto no necesariamente indica que la aplicación tenga algún problema.
152
153
154          </li>
155        </ul>
156      </li>
157    </ul>
158  </li>
159
160  <li>INTENDED_VSYNC
161    <ul>
162      <li>El punto de partida previsto del fotograma. Si este valor es diferente de VSYNC, el subproceso de la interfaz de usuario se encontraba ocupado, lo que evitó la respuesta a la señal vsync de manera oportuna.
163
164
165      </li>
166    </ul>
167  </li>
168
169  <li>VSYNC
170    <ul>
171      <li>El valor de tiempo que se utilizó en todas las escuchas vsync y las imágenes para el fotograma (devolución de llamada del fotograma Choreographer, animaciones, View.getDrawingTime(), etc.).
172
173      </li>
174
175      <li>Para obtener más información sobre VSYNC y cómo influye en su aplicación, consulte el video <a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=23">
176Understanding VSYNC</a>.
177
178      </li>
179    </ul>
180  </li>
181
182  <li>OLDEST_INPUT_EVENT
183    <ul>
184      <li>La marca de tiempo del evento de entrada más antiguo de la cola de entrada, o Long.MAX_VALUE en caso de que el fotograma no tengan ninguna entrada.
185
186      </li>
187
188      <li>Este valor está diseñado principalmente para trabajar en la plataforma y tiene utilidad limitada para los desarrolladores de aplicaciones.
189
190      </li>
191    </ul>
192  </li>
193
194  <li>NEWEST_INPUT_EVENT
195    <ul>
196      <li>La marca de tiempo del evento de entrada más reciente de la cola de entrada, o 0 en caso de que el fotograma no contenga ninguna entrada.
197
198      </li>
199
200      <li>Este valor está diseñado principalmente para trabajar en la plataforma y tiene utilidad limitada para los desarrolladores de aplicaciones.
201
202      </li>
203
204      <li>Sin embargo, puede obtener una idea general sobre la cantidad de latencia que la aplicación está añadiendo consultando (FRAME_COMPLETED - NEWEST_INPUT_EVENT).
205
206      </li>
207    </ul>
208  </li>
209
210  <li>HANDLE_INPUT_START
211    <ul>
212      <li>La marca de tiempo en que el evento de entrada se distribuye a la aplicación.
213      </li>
214
215      <li>Al observar el tiempo entre esto y ANIMATION_START, se puede medir cuánto tiempo dedicó la aplicación a la administración de eventos de entrada.
216
217      </li>
218
219      <li>Si este valor es alto (mayor a 2 ms), esto significa que la aplicación dedica tiempo poco común al proceso de los eventos de entrada, como View.onTouchEvent(), lo que indica que este proceso se debe optimizar o descargar a otro subproceso.
220
221 Tenga en cuenta que, en algunas ocasiones, como cuando al hacer clic en un evento que lanza nuevas actividades o algo parecido, se espera y es aceptable que este valor sea alto.
222
223
224      </li>
225    </ul>
226  </li>
227
228  <li>ANIMATION_START
229    <ul>
230      <li>La marca de tiempo en la que se ejecutaron las animaciones registradas con Choreographer.
231      </li>
232
233      <li>Al observar el tiempo entre esto y PERFORM_TRANVERSALS_START, se puede determinar cuánto tiempo llevó evaluar todos los mecanismos de animación (los más comunes son ObjectAnimator, ViewPropertyAnimator y Transitions) que se estén ejecutando.
234
235
236      </li>
237
238      <li>Si este valor es alto (mayor a 2 ms), controle si su aplicación escribió alguna animación personalizada o qué campos está animando ObjectAnimators y asegúrese de que su animación sea adecuada.
239
240
241      </li>
242
243      <li>Para obtener más información sobre Choreographer, consulte el video <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>Si a este valor le resta DRAW_START, puede saber cuánto tardaron en completarse las fases de medición y diseño. (Durante el desplazamiento o la animación, este número deberá ser cercano a cero).
252
253
254      </li>
255
256      <li>Para obtener más información sobre las fases de medición y diseño de la canalización de representación, consulte el video <a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">
257Invalidations, Layouts and Performance</a>.
258
259      </li>
260    </ul>
261  </li>
262
263  <li>DRAW_START
264    <ul>
265      <li>El momento en que comenzó la fase de dibujo de performTraversals. Este es el punto inicial de grabación de la listas de visualización de cualquier vista invalidada.
266
267      </li>
268
269      <li>El tiempo entre esto y SYNC_START muestra cuánto se tardó en llamar a View.draw() en todas las vistas invalidadas en el árbol.
270
271      </li>
272
273      <li>Para obtener más información sobre el modelo de dibujo, consulte los videos <a href="{@docRoot}guide/topics/graphics/hardware-accel.html#hardware-model">Hardware Acceleration</a>
274 o <a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">
275Invalidations, Layouts and Performance.</a>
276      </li>
277    </ul>
278  </li>
279
280  <li>SYNC_START
281    <ul>
282      <li>El momento en que comenzó la fase de sincronización del dibujo.
283      </li>
284
285      <li>Si el tiempo entre esto e ISSUE_DRAW_COMMANDS_START es muy alto (mayor a 0,4 ms o similar), generalmente esto significa que se dibujaron muchos mapas de bits que se deben subir a GPU.
286
287
288      </li>
289
290      <li>Para obtener más información sobre la fase de sincronización, consulte el video <a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&amp;index=24&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu">
291Profile GPU Rendering.</a>
292      </li>
293    </ul>
294  </li>
295
296  <li>ISSUE_DRAW_COMMANDS_START
297    <ul>
298      <li>El momento en que el representador de hardware comenzó a enviar comandos de dibujo a GPU.
299      </li>
300
301      <li>El tiempo entre esto y FRAME_COMPLETED permite obtener una idea general sobre cuánto trabajo le genera la aplicación a GPU.
302 Aquí aparecen los problemas como el exceso de dibujos o efectos de representación ineficientes.
303
304      </li>
305    </ul>
306  </li>
307
308  <li>SWAP_BUFFERS
309    <ul>
310      <li>El momento en que se llamó a eglSwapBuffers, generalmente de poca importancia fuera del trabajo en plataforma.
311
312      </li>
313    </ul>
314  </li>
315
316  <li>FRAME_COMPLETED
317    <ul>
318      <li>¡Todo listo! El tiempo total dedicado al trabajo en este fotograma se puede calcular al hacer FRAME_COMPLETED - INTENDED_VSYNC.
319
320      </li>
321    </ul>
322  </li>
323
324</ul>
325
326<p>
327  Puede utilizar esta información de distintas maneras. Un método de visualización simple pero eficaz es el histograma que muestra la distribución de los tiempos del fotograma (FRAME_COMPLETED - INTENDED_VSYNC) en distintos bloques de latencia; vea la siguiente figura.
328
329 Este gráfico indica brevemente que la mayoría de los fotogramas estuvieron muy bien, es decir, por debajo del límite de 16 ms (marcado en rojo). Sin embargo, algunos fotogramas estuvieron muy por arriba del límite.
330
331 En el histograma, podemos observar los cambios con el correr del tiempo para ver la creación de los cambios totales o los nuevos valores atípicos.
332 También puede graficar la latencia de entrada, el tiempo dedicado al diseño o cualquier otra medición interesante similar sobre las marcas de tiempo en los datos.
333
334
335</p>
336
337<img src="{@docRoot}preview/images/perf-test-framestats.png">
338
339
340<h3 id="timing-dump">Volcado simple del intervalo del fotograma</h3>
341
342<p>
343  Si, en las Opciones de Desarrollador, <strong>Profile GPU rendering</strong> se configura en <strong>In adb shell dumpsys gfinfo</strong>, el comando <code>adb shell dumpsys gfxinfo</code> emite sobre el tiempo de los 120 fotogramas más recientes y los agrupa en algunas categorías diferentes con valores separados por tabulación.
344
345
346 Esta información puede resultar útil para indicar qué partes de la canalización del dibujo podrían funcionar lento en un nivel alto.
347
348</p>
349
350<p>
351  Al igual que <a href="#fs-data-format">framestats</a>, es muy sencillo pegar esta información en su herramienta de hoja de cálculo preferida, o recolectar y redistribuir con un script.
352
353 El siguiente gráfico detalla dónde pasaron tiempo muchos de los fotogramas generados por la aplicación.
354
355</p>
356
357<img src="{@docRoot}preview/images/perf-test-frame-latency.png">
358
359<p>
360  El resultado de ejecutar gfxinfo, copiar la salida, pegar en una aplicación de hoja de cálculo y graficar la información en forma de barras apiladas.
361
362</p>
363
364<p>
365  Cada barra vertical representa un fotograma de animación, su altura representa la cantidad de milisegundos que le llevó calcular ese fotograma de animación.
366 Cada segmento de color de la barra representa una etapa diferente de la canalización de representación, de manera que usted pueda observar qué partes de su aplicación pueden estar creando un cuello de botella.
367
368 Para obtener más información sobre la canalización de representación y cómo optimizarla, consulte el video <a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;index=27&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">
369Invalidations Layouts and Performance</a>.
370
371</p>
372
373
374<h3 id="collection-window">Control del período de recopilación de datos</h3>
375
376<p>
377  Los intervalos de framestats y del fotograma simple recopilan datos durante un período muy breve: aproximadamente dos segundos que valen la pena representar.
378 Para poder controlar este período con precisión, por ejemplo para limitar los datos a una animación en particular, puede restablecer todos los contadores y agregar los datos recopilados.
379
380
381</p>
382
383<pre>
384&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; reset
385</pre>
386
387<p>
388  Esto se puede usar junto con los comandos de volcado para recopilar y restablecer a una cadencia normal a fin de capturar continuamente períodos de fotogramas de menos de dos segundos.
389
390
391</p>
392
393
394<h3 id="diagnose">Diagnóstico de regresiones de rendimiento</h3>
395
396<p>
397  La identificación de regresiones es un buen primer paso para localizar los problemas y mantener la aplicación funcionando correctamente.
398 Sin embargo, dumpsys solo identifica la existencia y la gravedad relativa de los problemas.
399 Usted todavía debe diagnosticar la causa particular de los problemas de rendimiento y encontrar las soluciones adecuadas.
400 Para esto, es sumamente recomendable que utilice la herramienta <a href="{@docRoot}tools/help/systrace.html">systrace</a>.
401
402</p>
403
404
405<h3 id="resources">Recursos adicionales</h3>
406
407<p>
408  Para obtener más información sobre el funcionamiento de la canalización de representación de Android, los problemas comunes que puede encontrar y cómo solucionarlos, es posible que algunos de los siguientes recursos le resulten útiles:
409
410
411</p>
412
413<ul>
414  <li>Rendering Performance 101
415  </li>
416  <li>Why 60fps?
417  </li>
418  <li>Android UI and the GPU
419  </li>
420  <li>Invalidations Layouts and performance
421  </li>
422  <li>Analyzing UI Performance with Systrace
423  </li>
424</ul>
425
426
427<h2 id="automate">Pruebas automatizadas de rendimiento de la UI</h2>
428
429<p>
430  Un enfoque para realizar la prueba de rendimiento de la UI es solicitar a un evaluador que realice una serie de operaciones de usuario en la aplicación objetivo para identificar visualmente jank, o bien, pasar mucho tiempo utilizando un enfoque basado en alguna herramienta para encontrar jank.
431
432 Sin embargo, este enfoque manual tiene sus riesgos, la habilidad humana para percibir cambios en los índices de los fotogramas varía de manera alarmante. Además, este proceso lleva mucho tiempo, es tedioso y propenso a errores.
433
434
435</p>
436
437<p>
438  Un método más eficiente es registrarse y analizar las mediciones de rendimiento clave a partir de pruebas automatizadas de UI.
439 Android M Developer Preview incluye nuevas capacidades de registro que facilitan la determinación de la cantidad y gravedad de jank en las animaciones de su aplicación y pueden utilizarse para crear un proceso estricto a fin de determinar su rendimiento actual y realizar un seguimiento de futuros objetivos de rendimiento.
440
441
442
443</p>
444
445<p>
446  Este artículo lo guía a través de un enfoque recomendado para utilizar esa información a fin de automatizar su prueba de rendimiento.
447
448</p>
449
450<p>
451  Esto se divide básicamente en dos acciones clave. Primero, identificar qué está probando y cómo lo prueba. Segundo, configurar y mantener un entorno de prueba automatizado.
452
453
454</p>
455
456
457<h3 id="ui-tests">Configuración de pruebas de UI</h3>
458
459<p>
460  Antes de comenzar con las pruebas automatizadas, es importante establecer algunas decisiones de alto nivel para entender correctamente el espacio de prueba y las necesidades que puede tener.
461
462</p>
463
464<h4>
465  Identifique flujos/animaciones clave que desea probar
466</h4>
467
468<p>
469  Recuerde que el usuario visualiza el rendimiento negativo cuando una animación fluida se interrumpe.
470 Por lo tanto, al identificar qué tipo de acciones de UI desea probar, se recomienda centrarse en aquellas animaciones clave que el usuario ve más o que son más importantes para su experiencia.
471
472 Por ejemplo, a continuación, se mencionan situaciones comunes que es útil identificar:
473</p>
474
475<ul>
476  <li>Desplazamiento por ListView o RecyclerView principales
477  </li>
478
479  <li>Animaciones durante ciclos de espera no sincronizados
480  </li>
481
482  <li>Animaciones que puedan contener manipulación o carga de mapa de bits
483  </li>
484
485  <li>Animaciones que incluyan combinación alfa
486  </li>
487
488  <li>Dibujos personalizados con Canvas
489  </li>
490</ul>
491
492<p>
493  Trabaje con los ingenieros, diseñadores y gerentes de productos de su equipo a fin de priorizar estas animaciones clave para la cobertura de la prueba.
494
495</p>
496
497<h4>
498  Establezca sus objetivos futuros y realice un seguimiento en virtud de ellos
499</h4>
500
501<p>
502  Desde un nivel alto, puede ser crítico identificar sus metas de rendimiento específicas y concentrarse en escribir pruebas y recopilar datos sobre ellas.
503 Por ejemplo:
504</p>
505
506<ul>
507  <li>¿Simplemente desea comenzar a realizar un seguimiento del rendimiento de la UI por primera vez para obtener más información?
508  </li>
509
510  <li>¿Desea evitar regresiones que podrían aparecer en el futuro?
511  </li>
512
513  <li>¿Se encuentra hoy en un 90 % de fluidez de fotogramas y quiere alcanzar un 98 % en este trimestre?
514  </li>
515
516  <li>¿Se encuentra en un 98 % de fluidez de fotogramas y no quiere retroceder?
517  </li>
518
519  <li>¿Tiene como objetivo mejorar el rendimiento en dispositivos de gama baja?
520  </li>
521</ul>
522
523<p>
524  Para todas estas situaciones, es recomendable realizar un seguimiento que muestre el rendimiento en múltiples versiones de su aplicación.
525
526</p>
527
528<h4>
529  Identifique los dispositivos en los que desea realizar la prueba
530</h4>
531
532<p>
533  El rendimiento de la aplicación varía según el dispositivo en el que se ejecuta. Algunos dispositivos pueden tener menos memoria, GPU menos potentes o CPU más lentos.
534 Esto significa que las animaciones que funcionan bien en un conjunto de hardware pueden no hacerlo en otros, o peor, pueden provocar un cuello de botella en diferentes secciones de la canalización.
535
536 Por lo tanto, para justificar esta variación en lo que un usuario puede ver, seleccione una serie de dispositivos, tanto de alta gama como de baja, tablets, etc., en los que ejecutará las pruebas.
537
538 Busque variedad en rendimiento de CPU, memoria RAM, resolución de pantalla, tamaño, etc.
539 Las pruebas exitosas en un dispositivo de alta gama pueden fallar en uno de baja gama.
540
541</p>
542
543<h4>
544  Marcos básicos para pruebas de UI
545</h4>
546
547<p>
548  Algunos conjuntos de herramientas, como <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> y <a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a>, están diseñados para ayudar a automatizar el desplazamiento de un usuario por su aplicación.
549
550 Estos son marcos simples que imitan la interacción del usuario con el dispositivo.
551 Para utilizar estos marcos, debe crear con éxito scripts únicos que se ejecuten en un conjunto de acciones de usuarios y reproducirlos en el dispositivo en sí.
552
553
554</p>
555
556<p>
557  Al combinar estas pruebas automatizadas junto con <code>dumpsys gfxinfo</code>, puede crear rápidamente un sistema reproducible que le permite ejecutar una prueba y medir la información de rendimiento de esa condición particular.
558
559
560</p>
561
562
563<h3 id="automated-tests">Configurar pruebas automatizadas de UI</h3>
564
565<p>
566  Una vez que pueda ejecutar una prueba de UI y una canalización para recopilar datos de una sola prueba, el próximo paso importante es elegir un marco que pueda ejecutar esa prueba muchas veces en múltiples dispositivos y agregar los datos de rendimiento resultantes para que su equipo de desarrollo los analice mejor.
567
568
569
570</p>
571
572<h4>
573  Un marco para la automatización de pruebas
574</h4>
575
576<p>
577  Vale la pena mencionar que los marcos para pruebas de UI (como <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a>) se ejecutan directamente en el emulador/dispositivo objetivo.
578 A la recopilación de información de rendimiento realizada por
579<em>dumpsys gfxinfo</em> la impulsa un equipo de host que envía comandos por ADB. Para ayudar a unir la automatización de estas entidades separadas, se diseñó el marco <a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner.</a> Un sistema de scripts que se ejecuta en su equipo de host y que puede emitir comandos a un conjunto de dispositivos conectados y recibir datos de ellos.
580
581
582
583</p>
584
585<p>
586  Al crear un conjunto de scripts para la automatización adecuada de las pruebas de rendimiento de UI, usted podrá, como mínimo, utilizar MonkeyRunner para realizar con éxito las siguientes tareas:
587
588</p>
589
590<ul>
591  <li>Cargar e iniciar un APK deseado en un dispositivo objetivo, en múltiples dispositivos o en un emulador.
592  </li>
593
594  <li>Iniciar una prueba de UI automatizada y permitir que se ejecute.
595  </li>
596
597  <li>Recopilar información de rendimiento mediante <em>dumpsys gfxinfo</em><em>.</em>
598  </li>
599
600  <li>Añadir información y presentársela de manera útil al desarrollador.
601  </li>
602</ul>
603
604
605<h3 id="triage">Clasificar y solucionar problemas detectados</h3>
606
607<p>
608  Una vez que se identifican los patrones de problemas o las regresiones, el paso siguiente es identificar y aplicar la solución.
609 Si su marco de pruebas automatizadas preserva detalles precisos del intervalo para los fotogramas, puede ayudarlo a investigar cambios sospechosos de código o diseño (en el caso de una regresión), o delimitar la parte del sistema que está analizando al cambiar a una investigación manual.
610
611
612 Para realizar una investigación manual, <a href="{@docRoot}tools/help/systrace.html">systrace</a> es un buen lugar para comenzar, ya que muestra información precisa sobre cada etapa de la canalización de representación, cada subproceso y núcleo del sistema, además de cualquier marca de evento personalizada que usted defina.
613
614
615</p>
616
617<h4>
618  Descripción adecuada de intervalos temporales
619</h4>
620
621<p>
622  Es importante mencionar las dificultades para obtener y medir los intervalos que son producto del rendimiento de la representación.
623 Estos números son, por naturaleza, no deterministas y, a menudo, fluctúan según el estado del sistema, la cantidad de memoria disponible, el límite térmico y la última vez que un rayo solar tocó el área de la tierra donde se encuentra.
624
625 El punto es que puede ejecutar la misma prueba dos veces y obtener números apenas diferentes que pueden estar cerca pero no ser iguales.
626
627
628</p>
629
630<p>
631  Para recopilar y definir datos correctamente de esta manera, deberá ejecutar la misma prueba muchas veces y acumular los resultados como un promedio o un valor promedio (para que resulte más fácil, lo llamaremos un “lote”). Esto le ofrece una aproximación estimada del rendimiento de la prueba, sin requerir intervalos exactos.
632
633
634
635</p>
636
637<p>
638  Los lotes se pueden usar entre cambios de código para verificar el impacto relativo que esos cambios tienen en el rendimiento.
639 Si el índice de fotograma promedio para el lote previo al cambio es que el lote después del cambio, entonces, generalmente está en presencia de un incremento general en relación con el rendimiento para ese cambio particular.
640
641
642</p>
643
644<p>
645  Esto significa que cualquier prueba automatizada de UI que lleve a cabo debería tener en cuenta este concepto, además de justificar cualquier anomalía que pudiera surgir durante una prueba.
646 Por ejemplo, si el rendimiento de su aplicación disminuye repentinamente debido a algún problema con el dispositivo (que no sea provocado por la aplicación), deberá volver a ejecutar el lote para obtener intervalos menos caóticos.
647
648
649
650</p>
651
652<p>
653  Entonces, ¿cuántas veces debe ejecutar una prueba para que los resultados sean significativos? El mínimo debe ser 10 veces y con números más altos, como 50 o 100, para obtener resultados más precisos (por supuesto, ahora cambia el tiempo por la precisión).
654
655
656</p>
657