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&index=25&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> adb shell dumpsys gfxinfo <PACKAGE_NAME> 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>adb shell dumpsys gfxinfo <PACKAGE_NAME> 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 <PACKAGE_NAME> 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&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&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&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&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&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&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&index=24&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&index=27&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>adb shell dumpsys gfxinfo <PACKAGE_NAME> 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