34

Firebug のプロファイラーを使用して、発生している JavaScript パフォーマンスの問題の原因をよりよく理解しようとしてきましたが、出力に少し混乱しています。

一部のコードをプロファイリングすると、プロファイラーはProfile (464.323 ms, 26,412 calls) を報告します。464.323 ミリ秒は、これらの 26,412 回の呼び出しの実行時間の合計であると思われます。

ただし、詳細な結果にドリルダウンすると、平均実行時間が 464.323 ミリ秒を超える個々の結果が表示されます。たとえば、平均時間が最も長い結果では、次の詳細が報告されます。

Calls: **1**
Percent: **0%**
Own Time: **0.006 ms**
Time: **783.506 ms**
Avg: **783.506 ms**
Min: **783.506 ms**
Max: **783.506 ms**

別の結果レポート:

Calls: **4**
Percent: **0.01%**
Own Time: **0.032 ms**
Time: **785.279 ms**
Avg: **196.32 ms**
Min: **0.012 ms**
Max: **783.741 ms**

これら 2 つの結果の間で、時間の結果の合計は 464.323 をはるかに超えています。

では、これらのさまざまな数字は何を意味するのでしょうか。どちらを信頼する必要がありますか?

4

4 に答える 4

25

各列には、Firebug でマウスをホバーするように設定した場合の意味が説明されています。各列が自分でどのように機能するかを読んでいただけると思います。ただし、説明が必要な奇妙な動作に遭遇したことは間違いありません。

自身の時間は、関数がその内部でコードを実行するのに費やした時間です。関数が他の関数を呼び出さない場合、自身の時間はtimeと同じでなければなりません。ただし、ネストされた関数呼び出しがある場合、時間はそれらの実行に費やされた時間もカウントします。したがって、ほとんどの場合、時間は自分の時間よりも長くなり、ほとんどの場合、プロファイラーによって報告された合計時間よりも多くなります。

ただし、どの関数の時間も、プロファイラーが記録した JavaScript 呼び出しの合計時間より大きくなってはなりませんこの問題は間違いなくバグであり、Firebug がそのような逆説的な出力を与えるときに、なぜ Firebug を信頼できないのかがわかります。このバグが発生する理由を突き止めたと思います: AJAX.

AJAX 呼び出しが原因で、ネストされた関数呼び出しをカウントする列が誤った情報を報告しているようです。JavaScript の実行時間とサーバーへのリクエストの両方をカウントすることなります。

このプロファイラーのバグは、次の手順で再現できます。

  1. AJAX を使用する任意のサイトに移動します。(私は http://juicystudio.com/experiments/ajax/index.phpを使用しました)
  2. コンソール/スクリプトのデバッグを有効にします。
  3. プロファイラーをオンにします。
  4. AJAX 呼び出しを行います。(複数あると、問題がより明確になる可能性があります。)
  5. プロファイラーを停止し、出力を調べます。

この例では、時間と自分の時間に関して関数自分の時間が合計されてプロファイラーの合計時間になりますが、時間列には、AJAX 呼び出しがサーバーと通信するのにかかった時間が組み込まれています。これは、JavaScript の実行速度だけを求めている場合、時間列が正しくないことを意味します。

最悪の場合: timeaverage timeminmaxはすべてネストされた関数呼び出しをカウントするため、AJAX を使用している場合はすべて正しくありません。その上、(ネストされた関数呼び出しで) 最終的に AJAX を使用する関数も、その時間を正しく報告しません。これは、多くの関数が誤った情報を報告している可能性があることを意味します! したがって、Firebug が問題を修正するまで、現時点ではこれらの列を信頼しないでください。(彼らがこのような動作を意図していた可能性はありますが、このままにしておくのは混乱を招きます。)

AJAX を使用していない場合は、別の問題が発生しています。あなたがそうであるかどうかをお知らせください。

于 2009-03-02T03:10:07.147 に答える
5

Firebug チュートリアル - ロギング、プロファイリング、およびコマンドライン (パート II)から: (良い例があります)

プロファイラーの列と説明

関数列: 各関数の名前を表示します。
呼び出し列: 特定の関数が呼び出された回数を示します。
パーセント列: 各機能の所要時間をパーセンテージで示します。
時間列: 関数の開始点から関数の終了点までの実行時間を示します。
平均列: 特定の関数の平均実行時間を示します。関数を 1 回だけ呼び出している場合、違いはわかりません。複数回呼び出している場合は、違いがわかります。
その列の式は、
Avg = Own Ttime / Call; です。
最小列と最大列: 特定の機能の最小実行時間を示します。
ファイル列: 関数が配置されたファイルのファイル名。

于 2009-03-02T04:05:41.317 に答える
5

私が物事を正しく理解していれば、次のようになります。

最初の行で、Own time が「わずか 0.006ms」であることがわかります。つまり、その関数で費やされた時間は 783.506 ミリ秒でしたが、そのほとんどはその関数から呼び出された関数内で費やされたことを意味します。

Firebug を使用してコードを最適化する場合、最も多く呼び出される関数の「独自の時間」を削減しようとします。(明らかに、不要な関数呼び出しもチェックして完全に削除します)

于 2008-11-06T07:35:40.083 に答える
2

私が理解していることから、これがどのように機能するかです...プロファイラーの合計時間は、「自分の時間」列の合計です。ただし、一部の単一のTime 値がプロファイラーの合計時間よりも大きい場合があることに気付く場合があります。これらの残業は JavaScript の外で費やされました。プラグイン呼び出しで。たとえば、JS 関数がプラグイン呼び出しを行い、プラグイン関数が JS に戻るのを待機する場合、これらの待機時間は合計プロファイラー時間によって報告されませんが、時間列に含まれます。

于 2012-06-16T03:51:50.770 に答える