理解Firebug分析器的输出结果

34

我一直在尝试使用Firebug的分析器来更好地了解一些JavaScript性能问题的源头,但是我对输出结果有点困惑。

当我对一些代码进行分析时,分析器报告“Profile (464.323 ms, 26,412 calls)”。“464.323 ms”可能是这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要大得多。

那么,这些各种数字意味着什么?我应该信任哪些数字?


1
只是提供信息,我仍然看到相同的问题,并且在一个不使用AJAX的页面上。我在我的页面上看到总的分析时间为17秒,在控制台中的第一行有一个“时间”为24秒。我不知道如何解释这个。 - rocketmonkeys
我自己也注意到了这一点。它发生在某些递归函数中,所以我猜可能是将每个实例分别计算并累加结果。 - Elias Zamaria
4个回答

25
每一列都有一个描述,如果你将鼠标悬停在Firebug上,它会告诉你这意味着什么。我假设您可以自行了解每一列的工作方式。但是,您肯定遇到了一些需要解释的奇怪行为。
“Own time”是函数在其内部执行代码所花费的时间。如果函数不调用其他函数,则“own time”应与“time”相同。但是,如果有嵌套的函数调用,则“time”还计算执行它们所花费的时间。因此,“time”几乎总是大于“own time”,在大多数情况下,它们加起来的时间都比分析器报告的总时间长。
然而,没有任何一个单独的函数的“time”应该大于分析器记录的JavaScript调用的总时间。这个问题绝对是一个错误,我可以理解为什么当Firebug给出如此自相矛盾的输出时,您会有信任问题。我相信我已经找到了这个错误发生的原因:AJAX。
似乎AJAX调用会导致计算嵌套函数调用的列报告不正确的信息。它们最终会计算JavaScript执行和向服务器发送请求的时间。
您可以通过以下方式重现此分析器错误:
  1. 进入任何使用AJAX的网站。(我使用了http://juicystudio.com/experiments/ajax/index.php
  2. 启用控制台/脚本调试。
  3. 打开分析器。
  4. 进行AJAX调用。(多个调用可能会更明显地显示问题。)
  5. 停止分析器,检查输出。

在这个例子中,关于时间和独立时间,每个函数的独立时间加起来等于分析器的总时间,但是时间列包括AJAX调用与服务器通信所需的时间。这意味着如果你只想要JavaScript执行速度,时间列是不正确的。

更糟糕的是:由于时间、平均时间、最小值和最大值都计算嵌套函数调用,如果你正在使用AJAX,它们都是不正确的。此外,任何最终使用AJAX(在嵌套函数调用中)的函数也会报告他们的时间不正确。这意味着许多函数可能会报告不正确的信息!因此,在Firebug修复这个问题之前,现在不要相信任何那些列。(虽然可能他们打算让行为保持这样,但这种做法最多是令人困惑。)

如果你没有使用AJAX,那么另一个问题就出现了;如果你使用或不使用,请告诉我们。


在问题本身上留了一个评论;我仍然看到一些非AJAX页面,其“时间”大于总配置文件时间。非常令人困惑。除了AJAX之外,还有什么原因可能导致这种情况? - rocketmonkeys

5

如果我理解正确,情况大致如下:

在第一行中,您将看到“拥有时间”仅为“0.006ms”。这意味着尽管在该函数中花费的时间为783.506ms,但其中大部分时间都花费在从该函数调用的其他函数内。

当我使用Firebug优化代码时,我尝试减少被最多调用的函数的“拥有时间”。(显然还要检查是否存在不必要的函数调用以彻底删除它们)


5

来自Firebug教程 - 日志记录、分析和命令行(第二部分)

函数列:显示每个函数的名称。
调用列:显示特定函数被调用的次数。
百分比列:以百分比显示每个函数的时间消耗。
时间列:显示从函数的起始点到结束点执行的持续时间。
平均列:显示特定函数的平均执行时间。如果您只调用一次函数,则看不到差异。如果您调用多次,则会看到差异。
该列的公式为
Avg = Own Ttime / Call;
最小列和最大列:显示特定函数的最短执行时间。
文件列:函数所在文件的文件名。


2

据我所知,它的工作原理如下... 总分析器时间是“拥有时间”列的总和。然而,您可能会注意到一些单个时间值可能大于总分析器时间。这些加班时间是在JavaScript之外花费的,例如在插件调用中。如果您的JS函数进行插件调用等待插件函数返回到JS,则这些等待时间将不会被总分析器时间报告,但将包括在时间列中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接