Что означают предупреждения "Не оптимизированы" в Chrome Profiler?
Когда я использую инструменты разработчика в Chrome для сбора профилей ЦП, я получаю два загадочных предупреждения о функциях:
- Не оптимизирован: оптимизирован слишком много раз
- Не оптимизировано: встроенная поддержка
Что это значит? и каковы возможные решения?
Еще один, который я видел, не оптимизирован: TryCatchStatement, но это имеет смысл. Решение заключается в удалении try-catch.
Самая близкая попытка объяснения, которое я нашел до сих пор, - это https://github.com/GoogleChrome/devtools-docs/issues/53
Ответы
Ответ 1
-
Я считаю, что "Не оптимизировано: оптимизировано слишком много раз" относится к тому, когда хром-оптимизатор сохраняет повторную оптимизацию функции.
https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY
Если я правильно помню, есть несколько вещей, которые могут вызвать это, включая параметры, которые меняют тип, я попытаюсь выкопать ссылку.
Это несколько загадочно, и исправления будут зависеть от вашего кода. У меня это всплывало в моем коде много раз, и иногда я просто не могу это исправить.
-
'Не оптимизирован: inlining bailed out' Кажется, ответив на ссылку, вы опубликовали.
-
Для try/catch на этой странице github можно найти неисчерпывающий, но полезный список оптимизаций оптимизации Chrome:
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers
На этой странице упоминается, что попытки/уловы в настоящее время не оптимизированы:
- Функции генератора
- Функции, содержащие оператор for-of
- Функции, содержащие оператор try-catch
- Функции, содержащие оператор try-finally
- Функции, содержащие составное присвоение
- Функции, которые содержат составное назначение const
- Функции, содержащие литералы объектов, содержащие proto, или получить или установить объявления.
Ответ 2
Объяснения этих причин для спасения краудсорсируются и документируются в этом потоке github: https://github.com/GoogleChrome/devtools-docs/issues/53
Краткое объяснение: V8 не будет пытаться оптимизировать функции с некоторыми конструкциями, блок try/catch является одним из примеров, полный список со временем может меняться по мере развития двигателя. Он также может отказаться, если он пытается оптимизировать, а затем должен слишком быстро отключить некоторую горячую функцию (например, из-за различной обратной связи по типу при каждом выполнении функции).
Ответ 3
У меня был
function generate_year_blob(year,action,callback){
...
do_blob({act: action, cb:callback, ...})
...
}
и я вызывал его всегда, используя только один параметр, такой как generate_year_blob(this_year)
.
Те action
(ожидаемые как строка) и callback
(ожидаемые как функция) были переданы функции do_blob()
.
Когда я изменил вызов от generate_year_blob(this_year)
до generate_year_blob(this_year,'',null)
, исчезло предупреждение Не оптимизировано: оптимизировано слишком много раз.
Я не нашел это сразу, потому что было много подобных функций generate_month_blob(...)
, generate_day_blob(...)
и т.д., которые вызывались со всеми определенными параметрами.
Ответ 4
Первый из них, вероятно, вызван тем, что движок оптимизировал его, но потом почему-то не нашел оптимизацию (может быть, тип возврата меняется со временем и т.д.).
Включение флажков --trace-opt и --trace-deopt должны помочь вам определить.
Мои оправдания, если ссылки, указанные в комментариях, уже указывали на вас.
Ответ 5
Я получал много предупреждений "Не оптимизирован: оптимизирован слишком много раз", и эти функции выполнялись намного медленнее, чем они должны были.
Я смог зафиксировать эти функции, выполнив следующие действия:
-
Удаление объявлений неиспользуемых переменных
-
Удаление вызовов функций из циклов, которые повторяются много раз ( > 1000 я подозреваю)