javascript - top - https://chrome:inspect
¿Qué significan las advertencias "No optimizadas" en Chrome Profiler? (5)
Cuando uso Developer Tools en Chrome para recopilar JavaScript CPU Profiles, recibo dos advertencias misteriosas sobre las funciones:
- No optimizado: optimizado muchas veces
- No optimizado: la financiación rescatada
¿Qué significan realmente? y ¿cuáles son algunas posibles soluciones?
Otro que he visto no está optimizado: TryCatchStatement , pero eso tiene sentido. La solución es eliminar el try-catch.
El intento más cercano a una explicación que he encontrado hasta ahora fue este: https://github.com/GoogleChrome/devtools-docs/issues/53
Creo que "No optimizado: optimizado demasiadas veces" se refiere a cuando el optimizador de Chrome sigue reoptimizando una función.
https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY
Si recuerdo correctamente, hay varias cosas que pueden causar esto, incluidos los parámetros que cambian el tipo, voy a tratar de desenterrar el enlace.
Este es algo críptico y las correcciones dependerán de tu código. He tenido esta ventana emergente en mi código muchas veces y, a veces, simplemente no puedo arreglarlo.
''No optimizado: rescatar salvamento'' Parece respondida en el enlace que ha publicado.
Para el try / catch, una lista no exhaustiva pero útil de las peculiaridades de optimización de Chrome se puede encontrar en esta página github:
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers
Esta página menciona que try / catch no está actualmente optimizado:
- Funciones del generador
- Funciones que contienen un enunciado for-of
- Funciones que contienen una declaración try-catch
- Funciones que contienen una declaración try-finally
- Funciones que contienen una asignación de asignación compuesta
- Funciones que contienen una asignación compuesta de const
- Funciones que contienen literales de objeto que contienen proto , o declaraciones get o set.
El primero es probable porque el motor lo ha optimizado, pero luego descubrió que la optimización no es buena por alguna razón (tal vez el tipo de devolución varía con el tiempo, etc.).
Habilitar los indicadores --trace-opt y --trace-deopt debería ayudarlo a identificar.
Mis excusas si los enlaces provistos en los comentarios ya te señalaron allí.
Estaba recibiendo muchas de las advertencias ''No optimizado: optimizado demasiadas veces'' y estas funciones se estaban ejecutando mucho más lentamente de lo que deberían.
Pude arreglar estas funciones haciendo estas cosas:
Eliminar declaraciones de variables no utilizadas
Eliminar llamadas a funciones de bucles que se repiten muchas veces (> 1000 sospecho)
Las explicaciones de estos motivos de rescate están siendo compiladas y documentadas en este hilo de github: https://github.com/GoogleChrome/devtools-docs/issues/53
La breve explicación: V8 no intentará optimizar las funciones con algunas construcciones, el bloque try / catch es un ejemplo, la lista completa puede cambiar con el tiempo a medida que el motor evoluciona. También puede ceder si trata de optimizar y luego tiene que desoptimizar algunas funciones calientes demasiadas veces (por ejemplo, debido a que el tipo de retroalimentación es diferente cada vez que se ejecuta la función).
Tuve un
function generate_year_blob(year,action,callback){ ... do_blob({act: action, cb:callback, ...}) ... }
y lo llamé siempre usando solo un parámetro como este generate_year_blob(this_year)
.
Esas action
(que se espera que sea una cadena) y la callback
(se espera que sea función) se pasaron a la función do_blob()
.
Cuando cambié la llamada de generate_year_blob(this_year)
a generate_year_blob(this_year,'''',null)
, desapareció la advertencia '' No optimizado: optimizado demasiadas veces ''.
No descubrí esto inmediatamente, porque había muchas funciones similares generate_month_blob(...)
, generate_day_blob(...)
etc. que se llamaron con todos los parámetros definidos.