我一直在尝试使用Firebug的分析器来更好地理解我们看到的一些JavaScript性能问题的来源,但我对输出有点困惑.
当我分析一些代码时,探查器报告Profile(464.323 ms,26,412个呼叫).我怀疑464.323 ms是这些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.
那么,这些不同的数字是什么意思呢?我应该相信哪些?
如果您将鼠标设置为在Firebug中将鼠标悬停在其上,则每列都有一个描述.我假设您可以阅读每个列如何在您自己的工作.但是,你肯定遇到过一些需要解释的奇怪行为.
在自己的时间是时间的函数花费执行自身内部的代码量.如果函数不调用其他函数,那么自己的时间应该与时间相同.但是,如果存在嵌套函数调用,则时间也会计算执行它们所花费的时间.因此,时间几乎总是大于自己的时间,并且在大多数情况下总计将超过分析器报告的总时间.
但是,单个函数的时间不应大于分析器为JavaScript调用记录的总时间.这个问题肯定是一个错误,我可以看到为什么当它给你这样一个矛盾的输出时你很难相信Firebug.我相信我已经找到了这个错误发生的原因:AJAX.
似乎AJAX调用导致计算嵌套函数调用的列报告错误信息.他们最终计算JavaScript执行的时间和对服务器的请求.
您可以通过执行以下操作重现此分析器错误:
转到使用AJAX的任何站点.(我使用过 http://juicystudio.com/experiments/ajax/index.php)
启用控制台/脚本调试.
打开探查器.
进行AJAX通话.(多个可能会更多地阐明这个问题.)
停止探查器,检查输出.
在这个例子中,关于时间与自己的时间,每个函数的自己的时间加起来分析器的总时间,但时间列包含AJAX调用与服务器通信所花费的时间.这意味着如果您只是寻找JavaScript执行的速度,则时间列不正确.
它变得最糟糕:因为时间,平均时间,最小值和最大值都计算嵌套函数调用,如果你使用的是AJAX,它们都是不正确的.最重要的是,任何最终使用AJAX的函数(在嵌套函数调用中)也会错误地报告它们的时间.这意味着很多功能可能会报告不正确的信息!因此,在Firebug修复此问题之前,不要相信任何这些列.(他们可能会以这种方式表达这种行为,尽管这样做会让人感到困惑.)
如果你没有使用AJAX,那么另一个问题就在于它; 如果你不喜欢,请告诉我们.
如果我理解正确,它会是这样的:
在第一行,您将看到自己的时间"仅为0.006ms".这意味着即使在该函数中花费的时间是783.506ms,其中大部分时间都花在了从该函数调用的函数中.
当我使用Firebug优化代码时,我尝试减少被称为最多的函数的"自己的时间".(显然还要检查任何不必要的函数调用以完全删除)
来自Firebug教程 - 记录,分析和CommandLine(第二部分) :(这些例子很好)
Profiler的列和描述
功能栏:显示每个功能的名称.
调用列:它显示调用特定函数的数量.
百分比列:以百分比显示每个功能的耗时.
时间列:显示从函数的起始点到函数的结束点的执行持续时间.
平均列:显示特定功能的平均执行时间.如果您只调用一次函数,则不会看到差异.如果您打电话不止一次,您会看到差异.
该列的公式是
Avg = Own Ttime/Call;
最小列和最大列:它显示特定功能的最短执行时间.
文件列:函数所在文件的文件名.