JavaScript CPUプロファイルを収集するためにChromeで開発者ツールを使用すると、関数に関する2つの不可解な警告が表示されます。
これらは実際にはどういう意味ですか?そして、いくつかの可能な解決策は何ですか?
私が見たもう1つは最適化されていません:TryCatchStatementですが、それは理にかなっています。解決策は、try-catchを削除することです。
私がこれまでに見つけた説明で最も近い試みはこれでした- https://github.com/GoogleChrome/devtools-docs/issues/5
「最適化されていない:最適化が多すぎる」とは、chromeオプティマイザーが関数の再最適化を続けていることを指します。
https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY
正しく思い出せば、タイプを変更するパラメーターなど、これを引き起こす可能性のあるものがいくつかあります。リンクを掘り下げてみます。
これはやや不可解であり、修正はコードに依存します。私はこれをコードに何度も表示しましたが、ときどき修正できないことがあります。
「最適化されていません:インライン展開が救済されました」投稿したリンクに回答があるようです。
Try/catchについては、網羅的ではないが便利なChrome=最適化の癖のリストがこのgithubページにあります。
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers
このページには、try/catchesが現在最適化されていないことが記載されています。
これらの救済理由の説明はクラウドソース化され、このgithubスレッドで文書化されています: https://github.com/GoogleChrome/devtools-docs/issues/5
簡単な説明:V8はいくつかの構成要素で関数の最適化を試みません。try/ catchブロックはその一例です。エンジンが進化するにつれて、完全なリストは時間とともに変化する可能性があります。また、最適化を試行し、一部のホット関数を何度も最適化解除しなければならない場合(たとえば、関数が実行されるたびに型フィードバックが異なるため)giveめます。
持っていた
function generate_year_blob(year,action,callback){ ... do_blob({act: action, cb:callback, ...}) ... }
そして、このgenerate_year_blob(this_year)
のようなパラメーターを常に1つだけ使用して呼び出しました。
これらのaction
(文字列であると予想される)およびcallback
(関数であると予想される)は、do_blob()
関数に渡されました。
呼び出しをgenerate_year_blob(this_year)
からgenerate_year_blob(this_year,'',null)
に変更すると、「最適化されていない:最適化が多すぎる」という警告が消えました。
すべてのパラメーターが定義された状態で呼び出された同様の関数generate_month_blob(...)
、generate_day_blob(...)
などが多数あったため、すぐにはわかりませんでした。
最初の理由は、エンジンが最適化したためである可能性がありますが、何らかの理由で最適化が適切でないことがわかりました(戻り値の型は時間とともに変化するなど)。
フラグ--trace-optおよび--trace-deoptを有効にすると、正確に特定できます。
コメントで提供されているリンクが既にそこにあなたを指している場合、私の言い訳。
「最適化されていない:最適化が何度も最適化されています」という警告が多く表示され、これらの機能は本来あるべき速度よりはるかに遅く実行されていました。
これらのことを行うことで、これらの機能を修正することができました。
未使用の変数宣言を削除する
何度も繰り返されるループから関数呼び出しを削除する(> 1000疑わしい)