web-dev-qa-db-fra.com

Que signifient les avertissements "Non optimisé" dans le Chrome Profiler signifie?

Lorsque j'utilise les outils de développement dans Chrome pour collecter les profils de processeur JavaScript, je reçois deux mystérieux avertissements sur les fonctions:

  • Non optimisé: optimisé trop de fois
  • Non optimisé: renflouage interne renfloué

Qu'est-ce que cela signifie réellement? et quelles sont les solutions possibles?

Un autre que j'ai vu est Non optimisé: TryCatchStatement , mais cela a du sens. La solution consiste à supprimer le try-catch.

La tentative d'explication la plus proche que j'ai trouvée jusqu'à présent était la suivante: https://github.com/GoogleChrome/devtools-docs/issues/5

61
Luke
  1. Je pense que "Non optimisé: optimisé trop de fois" fait référence à l'optimiseur chrome continue de réoptimiser une fonction.

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

    Si je me souviens bien, il y a plusieurs choses qui peuvent provoquer cela, y compris des paramètres qui changent de type, je vais essayer de creuser le lien.

    Celui-ci est quelque peu cryptique et les correctifs dépendront de votre code. J'ai eu ce pop-up plusieurs fois dans mon code et parfois je ne peux pas le réparer.

  2. 'Pas optimisé: renflouement interne renfloué' semble avoir répondu dans le lien que vous avez publié.

  3. Pour le try/catch, une liste non exhaustive mais utile de Chrome bizarreries d'optimisation peut être trouvée sur cette page github:

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

    Cette page mentionne que les tentatives/captures ne sont pas actuellement optimisées:

    • Fonctions de générateur
    • Fonctions contenant une instruction for-of
    • Fonctions contenant une instruction try-catch
    • Fonctions contenant une instruction try-finally
    • Fonctions contenant une affectation de let composée
    • Fonctions contenant une affectation de const composée
    • Fonctions contenant des littéraux d'objet contenant proto , ou des déclarations get ou set.
21
David

Les explications de ces raisons de sauvetage sont externalisées et documentées dans ce fil de discussion Github: https://github.com/GoogleChrome/devtools-docs/issues/5

La courte explication: V8 n'essaiera pas d'optimiser les fonctions avec certaines constructions, le bloc try/catch en est un exemple, la liste complète peut changer avec le temps au fur et à mesure que le moteur évolue. Il peut également abandonner s'il essaie d'optimiser et doit ensuite désoptimiser une fonction chaude trop de fois (par exemple, en raison du type de rétroaction différent à chaque exécution de la fonction).

7
Paul Irish

J'ai eu un

function generate_year_blob(year,action,callback){ ... do_blob({act: action, cb:callback, ...}) ... }

et je l'ai appelé en utilisant toujours un seul paramètre comme celui-ci generate_year_blob(this_year).

Ces action (qui devrait être une chaîne) et callback (qui devrait être une fonction) ont été passés à la fonction do_blob().

Lorsque j'ai changé l'appel de generate_year_blob(this_year) à generate_year_blob(this_year,'',null), l'avertissement 'Non optimisé: trop optimisé' a disparu.

Je ne l'ai pas découvert immédiatement, car il y avait beaucoup de fonctions similaires generate_month_blob(...), generate_day_blob(...) etc. qui étaient appelées avec tous les paramètres définis.

3
Timo Kähkönen

Le premier est probablement dû au fait que le moteur l'a optimisé, mais a trouvé que l'optimisation n'était pas bonne pour une raison quelconque (peut-être que le type de retour varie dans le temps, etc.).

L'activation des indicateurs --trace-opt et --trace-deopt devrait vous aider à identifier.

Mes excuses si les liens fournis dans les commentaires vous y pointaient déjà.

1
Hampus

J'obtenais beaucoup d'avertissements "Non optimisé: optimisé trop de fois" et ces fonctions fonctionnaient beaucoup plus lentement qu'elles ne devraient.

J'ai pu réparer ces fonctions en faisant ces choses:

  1. Suppression des déclarations de variables inutilisées

  2. Suppression des appels de fonction des boucles qui réitèrent plusieurs fois (> 1000 je soupçonne)

0
Joshua McCready