了解Firebug探查器输出

时间:2008-11-06 04:11:59

标签: javascript profiling firebug profiler

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

当我分析一些代码时,探查器会报告个人资料(464.323毫秒,26,412个电话)。我怀疑464.323毫秒是这些26,412个呼叫的执行时间的总和。

然而,当我深入研究详细结果时,我看到个别结果的平均执行时间大于464.323 ms,例如平均时间最长的结果会报告以下详细信息:

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 个答案:

答案 0 :(得分:24)

如果您将鼠标设置为在Firebug中将鼠标悬停在其上,则每列都会说明其含义。我假设您可以阅读每个列如何在您自己的工作。但是,你肯定会遇到一些需要解释的奇怪行为。

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

但是,单个功能的时间不应大于探查器为JavaScript调用记录的总时间。这个问题肯定是一个错误,我可以看到为什么当它给你这样一个矛盾的输出时你很难相信Firebug。我相信我已经找到了这个错误发生的原因:AJAX。

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

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

  1. 转到使用AJAX的任何网站。 (我用了 http://juicystudio.com/experiments/ajax/index.php
  2. 启用控制台/脚本调试。
  3. 打开探查器。
  4. 进行AJAX通话。 (多个问题可能会更多地阐明问题。)
  5. 停止探查器,检查输出。
  6. 在此示例中,关于时间自己的时间,每个功能的自己的时间加起来为探查器的总时间但 time 列包含了AJAX调用与服务器通信所花费的时间。这意味着如果您只是在寻找JavaScript执行的速度,那么 time 列是不正确的。

    最糟糕的是:因为时间平均时间 min max 都计算嵌套函数调用,如果你使用AJAX,它们都是不正确的。最重要的是,任何最终使用AJAX的函数(在嵌套函数调用中)也会错误地报告它们的时间。这意味着很多功能可能会报告不正确的信息!因此,在Firebug修复此问题之前,不要相信任何这些列。 (他们可能会以这种方式表达这种行为,尽管最好不要这样做。)

    如果你没有使用AJAX,那么另一个问题就在发挥作用;如果你不喜欢,请告诉我们。

答案 1 :(得分:5)

如果我理解正确的话,那就是这样的:

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

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

答案 2 :(得分:5)

来自Firebug Tutorial - Logging, Profiling and CommandLine (Part II): (这些例子很好)

  

Profiler的列和描述

     

功能栏:显示每个功能的名称   调用列:显示调用特定函数的数量。
  列百分比:以百分比显示每个功能的耗时   时间列:显示从函数的起点到函数终点的执行持续时间。
  平均列:显示特定功能的平均执行时间。如果您只调用一次函数,则不会看到差异。如果您打电话多次,您会看到不同之处         该列的公式为
        平均=自己的Ttime /呼叫;
  最小列和最大列:它显示特定功能的最短执行时间。
  文件列:功能所在文件的文件名。

答案 3 :(得分:1)

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