4

CPU 使用率を記録する Chrome JS プロファイラーを使用してアプリを実行しようとしましたが、いくつかの警告が表示されました。「ForInStatement は高速ではありません」という警告がいくつかありましたが、修正しましたが、「Inlining Bailed Out" 警告、たとえば次のコード:

function display_loader(){
  for(i in obstacles){
    display(obstacles[i])
  }
}

この関数は基本的に障害物を作成します (display(obstacles[i]) は障害物の特定の画像を描画します - 上記の「ForInStatement」警告のため、ロード用とコード用の 2 つの別個の関数)。

特に 1 分以上プレイすると、「Inlining Bailed Out」というメッセージがランダムに表示され、move_loader、display_loader、collision_loader 関数のいずれかに表示されます。するときもあれば、しないときもあります。

このメッセージの本当の意味を一言で説明してもらえますか? 私は Web 上で多くのスレッドを読み、「ForInStatement」のロジックは理解していますが、インライン展開についての手がかりはありません。

また、直し方を教えていただけないでしょうか。

ありがとうございました!

4

1 に答える 1

1

通常、bailout関数を最適化できなかったことを意味します。これは、ブロックなどのサポートされていない JS 機能、または最適化プロセスが特定の制限に達したために発生する可能性があります。try/catchfor of

ドキュメントが要約しているように:

すべての機能を最適化できるわけではありません。一部の機能は、最適化コンパイラが特定の関数で実行されないようにします (「救済」)。

この一連の記事では、いくつかの適切な説明が提供されています。基本的に、インライン化は優れたパフォーマンスに不可欠です。ただし、コストがかかるため、関数は体系的にインライン化されていません。通常、何度も呼び出された関数だけがインライン展開されます。

あなたの場合、あなたのdisplay関数には最適化を妨げる何かがあると思います。関数が最適化のために常に/直接選択されるとは限らないため、メッセージは直接ポップアップしません。

この最適化アプローチの結果の 1 つは、実行時間が短いプログラム [...] がウォームアップ フェーズを終了せず、最適化されないことです。一般に、非常に短時間しか実行されないものを最適化するためにエネルギーを浪費する必要はありません。

さらに、V8 は非決定論的サンプリング プロファイラーを使用してホット関数を検出することに注意してください。したがって、プロファイリング ティック中にどの関数がアクティブであるかによって、パフォーマンスが大幅に変化する可能性があります

さらに読むここ. お役に立てれば。

于 2016-01-25T14:33:51.987 に答える