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**

在这两个结果之间,时间结果的总和远远超过 464.323。

那么,这些不同的数字是什么意思呢?我应该信任哪些?

4

4 回答 4

25

如果您在 Firebug 中将鼠标悬停在每列上,则每列都有其含义的描述。我假设您可以自行阅读每列的工作原理。但是,您肯定遇到了一些需要解释的奇怪行为。

自己的时间是函数在其内部执行代码所花费的时间。如果该函数没有调用其他函数,那么自己的时间应该与时间相同。但是,如果有嵌套的函数调用,那么time也会计算执行它们所花费的时间。因此,时间几乎总是大于自己的时间,并且在大多数情况下加起来会超过分析器报告的总时间。

但是,任何单个函数的时间都不应大于分析器为 JavaScript 调用记录的总时间。这个问题绝对是一个错误,当 Firebug 为您提供如此自相矛盾的输出时,我可以理解为什么您无法信任它。我相信我已经找到了这个错误发生的原因:AJAX。

似乎 AJAX 调用导致计算嵌套函数调用的列报告不正确的信息。他们最终计算了 JavaScript 执行的时间对服务器的请求。

您可以通过执行以下操作来重现此探查器错误:

  1. 转到任何使用 AJAX 的站点。(我用过 http://juicystudio.com/experiments/ajax/index.php
  2. 启用控制台/脚本调试。
  3. 打开探查器。
  4. 进行 AJAX 调用。(多个可能更能说明问题。)
  5. 停止探查器,检查输出。

在此示例中,关于timeown time,每个函数的own time加起来是分析器的总时间,但time列包含 AJAX 调用与服务器通信所花费的时间。这意味着如果您只是在寻找 JavaScript 执行的速度,那么时间列是不正确的。

最糟糕的是:因为timeaverage timeminmax都计算嵌套函数调用,如果你使用 AJAX,它们都是不正确的。最重要的是,任何最终使用 AJAX(在嵌套函数调用中)的函数也会错误地报告它们的时间。这意味着很多函数可能会报告不正确的信息!因此,在 Firebug 解决问题之前,暂时不要相信这些列中的任何一个。(他们可能希望这种行为是这样的,尽管这样离开它充其量是令人困惑的。)

如果您不使用 AJAX,那么另一个问题在起作用;让我们知道您是否是。

于 2009-03-02T03:10:07.147 回答
5

如果我理解正确,它会是这样的:

在第一行,您会看到 Own 时间“只有 0.006 毫秒”。这意味着即使在该函数中花费的时间是 783.506 毫秒,但大部分时间都花在了从该函数调用的函数中。

当我使用 Firebug 优化代码时,我尝试减少被调用最多的函数的“自己的时间”。(显然还要检查是否有任何不必要的函数调用完全删除)

于 2008-11-06T07:35:40.083 回答
5

来自Firebug 教程 - 日志记录、分析和命令行(第二部分):(那里的例子很好)

Profiler 的列和说明

功能栏:显示每个功能的名称。
调用列:它显示了调用了多少特定函数的计数。
百分比列:它以百分比显示每个函数的耗时。
时间栏:显示从函数开始点到函数结束点的执行时间。
Avg 列:显示特定函数的平均执行时间。如果您只调用一次函数,您将看不到差异。如果您多次调用,您会看到差异。
该列的公式是
Avg = Own Ttime / Call;
最小列和最大列:它显示了特定函数的最短执行时间。
文件列:函数所在文件的文件名。

于 2009-03-02T04:05:41.317 回答
2

据我了解,这是它的工作原理......总探查器时间是“自己的时间”列的总和。但是,您可能会注意到某些单个Time 值可能大于总探查器时间。这些加班是在 JavaScript 之外度过的,例如。在插件调用中。如果您的 JS 函数对 eg. 进行了插件调用,并等待插件函数返回 JS,那么这些等待时间将不会被总分析器时间报告,但会包含在 Time 列中。

于 2012-06-16T03:51:50.770 回答