Что означают предупреждения "Не оптимизированы" в 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 я подозреваю)