it-swarm.com.ru

Что означают предупреждения «Не оптимизировано» в профилировщике Chrome?

Когда я использую Инструменты разработчика в Chrome для сбора профилей процессора JavaScript, я получаю два загадочных предупреждения о функциях:

  • Не оптимизировано: оптимизировано слишком много раз
  • Не оптимизировано: вкладка выручена

Что это на самом деле означает? и каковы некоторые возможные решения?

Еще один, который я видел, это Не оптимизировано: TryCatchStatement , но это имеет смысл. Решение состоит в том, чтобы удалить пробную версию.

Самая близкая попытка объяснения, которое я нашел до сих пор, заключалась в следующем - https://github.com/GoogleChrome/devtools-docs/issues/5

61
Luke
  1. Я считаю, что "Не оптимизировано: оптимизировано слишком много раз" относится к тому моменту, когда оптимизатор chrome продолжает повторную оптимизацию функции.

    https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY

    Если я правильно помню, есть несколько причин, которые могут вызвать это, в том числе параметры, которые меняют тип, я постараюсь выкопать ссылку.

    Это несколько загадочно, и исправления будут зависеть от вашего кода. У меня это всплывало в моем коде много раз, а иногда я просто не могу это исправить.

  2. "Не оптимизировано: вкладка выручена" Кажется, ответили по ссылке, которую вы разместили.

  3. Для try/catch на этой странице github можно найти неисчерпывающий, но полезный список Chrome причуда оптимизации:

    https://github.com/petkaantonov/bluebird/wiki/Optimization-killers

    На этой странице упоминается, что try/catches в настоящее время не оптимизированы:

    • Функции генератора
    • Функции, содержащие оператор for-of
    • Функции, содержащие оператор try-catch
    • Функции, содержащие оператор try-finally
    • Функции, которые содержат составное назначение let
    • Функции, содержащие составное константное присваивание
    • Функции, которые содержат литералы объектов, которые содержат proto , или получают или устанавливают объявления.
21
David

Объяснения по этим причинам катапультирования краудсорсинга и документированы в этой теме GitHub: https://github.com/GoogleChrome/devtools-docs/issues/5

Краткое объяснение: V8 не будет пытаться оптимизировать функции с помощью некоторых конструкций, блок try/catch является одним из примеров, полный список может со временем меняться по мере развития движка. Он также может сдаться, если попытается оптимизировать, а затем вынужден будет деоптимизировать некоторую горячую функцию слишком много раз (например, из-за того, что обратная связь типа различается при каждом выполнении функции).

7
Paul Irish

У меня есть

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(...) и т.д., Которые были вызваны со всеми определенными параметрами.

3
Timo Kähkönen

Первый, скорее всего, потому, что движок его оптимизировал, но потом по какой-то причине обнаружил, что оптимизация бесполезна (возможно, тип возврата меняется со временем и т.д.).

Включение флагов --trace-opt и --trace-deopt должно помочь вам точно определить.

Мои оправдания, если ссылки, приведенные в комментариях, уже указывали на вас.

1
Hampus

Я получал много предупреждений "Не оптимизировано: оптимизировано слишком много раз", и эти функции работали намного медленнее, чем следовало бы.

Я смог исправить эти функции, выполнив следующие действия:

  1. Удаление неиспользуемых объявлений переменных

  2. Удаление вызовов функций из циклов, которые повторяются много раз (> 1000 я подозреваю)

0
Joshua McCready