了解 Firebug 探查器输出

Posted

技术标签:

【中文标题】了解 Firebug 探查器输出【英文标题】:Understanding Firebug profiler output 【发布时间】:2010-09-21 00:34:20 【问题描述】:

我一直在尝试使用 Firebug 的分析器来更好地了解我们看到的一些 javascript 性能问题的根源,但我对输出有点困惑。

当我分析某些代码时,分析器会报告 Profile(464.323 毫秒,26,412 次调用)。我怀疑 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。

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

【问题讨论】:

仅供参考,我仍然看到同样的问题,并且在一个使用 AJAX 的页面上。我看到我的页面的总分析时间为 17 秒,控制台中的第一行的“时间”为 24 秒。我不知道如何解释。 我自己也注意到了。它发生在某些递归函数中,所以我猜测它可能是分别计算每个实例并将结果相加。 【参考方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

对问题本身发表评论;我仍然看到“时间”大于总配置文件时间的非 AJAX 页面。很混乱。知道除了 AJAX 之外还有什么原因?【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

来自Firebug Tutorial - Logging, Profiling and CommandLine (Part II): (那里的例子很好)

Profiler 的列和说明

函数列:显示每个函数的名称。调用列:显示特定函数被调用的次数。 百分比列 : 以百分比显示每个函数的耗时。时间列 : 显示函数从开始点到执行的持续时间函数的终点。 平均列:显示特定函数的平均执行时间。如果您只调用一次函数,您将看不到差异。如果您多次调用,您会看到差异。 该列的公式是 Avg = Own Ttime / Call;Min column and Max column:显示特定函数的最短执行时间。 文件列:函数所在文件的文件名。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于了解 Firebug 探查器输出的主要内容,如果未能解决你的问题,请参考以下文章

Firebug 不显示 ::before 和 ::after 伪元素

为Firefox浏览器安装Firebug插件

将“var_dump”发送到 FireBug 控制台

调试Ajax调用的利器firebug

Firebug & Chrome Console 控制台使用指南

如何使用 .HAR 文件生成 HTML UI(Firebug 节目)