aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/tools/performance/call_tree/index.html
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
commit33058f2b292b3a581333bdfb21b8f671898c5060 (patch)
tree51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/tools/performance/call_tree/index.html
parent8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff)
downloadtranslated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz
translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2
translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip
initial commit
Diffstat (limited to 'files/zh-cn/tools/performance/call_tree/index.html')
-rw-r--r--files/zh-cn/tools/performance/call_tree/index.html108
1 files changed, 108 insertions, 0 deletions
diff --git a/files/zh-cn/tools/performance/call_tree/index.html b/files/zh-cn/tools/performance/call_tree/index.html
new file mode 100644
index 0000000000..93700f1f75
--- /dev/null
+++ b/files/zh-cn/tools/performance/call_tree/index.html
@@ -0,0 +1,108 @@
+---
+title: Call Tree
+slug: Tools/Performance/Call_Tree
+translation_of: Tools/Performance/Call_Tree
+---
+<div>{{ToolsSidebar}}</div><div class="summary">
+<p><font><font>调用树会告诉您浏览器花费最多时间使用哪些JavaScript函数。通过分析其结果,您可以发现代码中的瓶颈 - 浏览器花费了大量时间的地方。</font></font></p>
+
+<p><font><font>这些瓶颈是您可以做出的任何优化都会产生最大影响的地方。</font></font></p>
+</div>
+
+<p><font><font>Call Tree是一个采样分析器。</font><font>它定期对JavaScript引擎的状态进行采样,并记录当时正在执行的代码的堆栈。</font><font>统计上,我们执行某个特定功能时采用的样本数量与浏览器执行它的时间相对应。</font></font></p>
+
+<div class="note">
+<p><font><font>在本文中,我们将使用简单程序的输出作为示例。</font><font>如果你想让程序试验你的个人资料,你可以在</font></font><a href="https://github.com/mdn/performance-scenarios/blob/gh-pages/js-call-tree-1/"><font><font>这里</font></font></a><font><font>找到它</font><font>。</font><font>您可以在</font></font><a href="https://github.com/mdn/performance-scenarios/blob/gh-pages/js-call-tree-1/profile/call-tree.json"><font><font>这里</font></font></a><font><font>找到我们讨论的特定配置文件</font><font>- 只需将其导入性能工具即可。</font></font></p>
+
+<p><font><font>有描述该计划的结构的短页面</font></font><a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Examples/Sorting_algorithms_comparison"><font><font>在这里</font></font></a><font><font>。</font></font></p>
+
+<p><font><font>请注意,我们使用相同的程序 - 实际上是相同的配置文件 - 在</font></font><a href="/en-US/docs/Tools/Performance/Flame_Chart"><font><font>Flame Chart</font></font></a><font><font>的文档页面中</font><font>。</font></font></p>
+</div>
+
+<p><font><font>下面的屏幕截图显示了一个程序的输出,该程序比较了三种排序算法 - 冒泡排序,选择排序和快速排序。</font><font>为此,它会生成一些填充了随机整数的数组,并依次使用每种算法对它们进行排序。</font></font></p>
+
+<p><font><font>我们</font></font><a href="/en-US/docs/Tools/Performance/UI_Tour#Zooming_in"><font><font>放大</font></font></a><font><font>了录制的部分,显示了一个很长的JavaScript标记:</font></font></p>
+
+<p><img alt="" src="https://mdn.mozillademos.org/files/10981/perf-call-tree.png" style="display: block; height: 574px; margin-left: auto; margin-right: auto; width: 1052px;"></p>
+
+<p><font><font>Call Tree将结果呈现在表格中。</font><font>每一行表示一个函数,其中至少取得一个样本,并且按照在该函数中取得的样本数从最高到最低排序行。</font></font></p>
+
+<p><em><font><font>样本</font></font></em><font><font>是我们执行这个特定函数时所采样本的数量。</font></font></p>
+
+<p><em><font><font>自我成本</font></font></em><font><font>是指该数字占记录选定部分样本总数的百分比。</font></font></p>
+
+<p><em><font><font>自我时间</font></font></em><font><font>是根据记录的选定部分覆盖的总</font><em><font>时间</font></em><font>将该数字转换为毫秒。</font></font></p>
+
+<p><font><font>在当前版本的调用树中,这些是最重要的列。</font><font>具有较高</font></font><em><font><font>自身成本的</font></font></em><font><font>函数</font><font>是优化的好选择,或者是因为它们需要很长时间才能运行,或者因为它们经常被调用。</font></font></p>
+
+<p><font><font>这个屏幕截图告诉我们一些我们可能已经知道的事情:泡泡排序是一种非常低效的算法。</font><font>泡沫分类中的样本数大约是选择排序中的六倍,是快速排序中的13倍。</font></font></p>
+
+<h2 id="走上调用树"><font><font>走上</font></font><font><font>调用树</font></font></h2>
+
+<p><font><font>每个函数名称旁边都有一个公开箭头:单击它,您可以看到从调用采样的函数到根的备用调用树的路径。</font><font>例如,我们可以扩展条目</font></font><code>bubbleSort()</code><font><font>:</font></font></p>
+
+<p><img alt="" src="https://mdn.mozillademos.org/files/10983/perf-call-tree-expanded-bubblesort.png" style="display: block; height: 512px; margin-left: auto; margin-right: auto; width: 1054px;"></p>
+
+<p><font><font>所以我们可以看到调用图如下所示:</font></font></p>
+
+<pre><font><font>sortAll()</font></font>
+<font><font>
+ - &gt; sort()</font></font>
+<font><font>
+ - &gt; bubbleSort()</font></font></pre>
+
+<p><font><font>另请注意</font><font>,</font><font>此处的</font></font><em><font><font>自我成本</font></font></em><font><font>为</font></font><code>sort()</code><font><font>1.45%,并且请注意,这</font></font><code>sort()</code><font><font>与列表中稍后</font><font>的单独条目相同</font><font>。</font><font>这告诉我们一些样本是</font></font><code>sort()</code><font><font>自己</font><font>采集的</font><font>,而不是它所调用的功能。</font></font></p>
+
+<p><font><font>有时从入口到顶层有多条路径返回。</font><font>让我们扩展条目</font></font><code>swap()</code><font><font>:</font></font></p>
+
+<p><img alt="" src="https://mdn.mozillademos.org/files/10985/perf-call-tree-expanded-sawp.png" style="display: block; height: 636px; margin-left: auto; margin-right: auto; width: 1052px;"></p>
+
+<p><font><font>里面有253个样本</font></font><code>swap()</code><font><font>。</font><font>但是</font></font><code>swap()</code><font><font>通过两种不同的途径达成了:两者</font></font><code>bubbleSort()</code><font><font>并</font></font><code>selectionSort()</code><font><font>使用它们。</font><font>我们还可以看到253个样本中</font></font><code>swap() </code><font><font>有</font><font>252个</font><font>在</font></font><code>bubbleSort()</code><font><font>分支中,只有一个在</font></font><code>selectionSort()</code><font><font>分支中。</font></font></p>
+
+<p><font><font>这个结果意味着冒泡排序比我们想象的效率更低!</font><font>它可以承担另外252个样本的责任,或几乎占总成本的10%。</font></font></p>
+
+<p><font><font>通过这种挖掘,我们可以计算出整个调用图和相关的样本数量:</font></font></p>
+
+<pre><font><font>sortAll()// 8</font></font>
+<font><font>
+ - &gt; sort()// 37</font></font>
+<font><font>
+ - &gt; bubbleSort()// 1345</font></font>
+<font><font>
+ - &gt; swap()// 252</font></font>
+<font><font>
+ - &gt; selectionSort()// 190</font></font>
+<font><font>
+ - &gt; swap()// 1</font></font>
+<font><font>
+ - &gt; quickSort()// 103</font></font>
+<font><font>
+ - &gt;分区()// 12</font></font></pre>
+
+<h2 id="平台数据"><font><font>平台数据</font></font></h2>
+
+<p><font><font>您还会看到一些标记为</font></font><em><font><font>Gecko</font></font></em><font><font>,</font></font><em><font><font>输入和事件</font></font></em><font><font>等的行。</font><font>这些代表内部浏览器调用。</font></font></p>
+
+<p><font><font>这也可以是有用的信息。</font><font>如果您的网站正在努力使浏览器工作,这可能不会显示为您的代码中记录的示例,但它仍然是您的问题。</font></font></p>
+
+<p><font><font>在我们的例子中,有679个样本被分配到</font></font><em><font><font>Gecko--</font></font></em><font><font>后面的第二大组</font></font><code>bubbleSort()</code><font><font>。</font><font>我们来扩展一下:</font></font></p>
+
+<p><img alt="" src="https://mdn.mozillademos.org/files/10987/perf-call-tree-expanded-gecko.png" style="display: block; height: 478px; margin-left: auto; margin-right: auto; width: 1050px;"></p>
+
+<p><font><font>这个结果告诉我们,这些样本中有614个,或约占总成本的20%,来自我们的</font></font><code>sort()</code><font><font>呼叫。</font><font>如果我们查看代码</font></font><code>sort()</code><font><font>,应该很明显,高平台数据成本来自重复呼叫</font></font><code>console.log()</code><font><font>:</font></font></p>
+
+<pre class="brush: js line-numbers language-js" style=""><code class="language-js" style=""><span class="keyword token" style="border: 0px; color: #0077aa; margin: 0px; padding: 0px;">function</span> <span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">sort</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span>unsorted<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span> <span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">{</span>
+ console<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">.</span><span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">log</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span><span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">bubbleSort</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span>unsorted<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">;</span>
+ console<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">.</span><span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">log</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span><span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">selectionSort</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span>unsorted<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">;</span>
+ console<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">.</span><span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">log</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span><span class="function token" style="border: 0px; color: #dd4a68; margin: 0px; padding: 0px;">quickSort</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">(</span>unsorted<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">)</span><span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">;</span>
+<span class="punctuation token" style="border: 0px; color: #999999; margin: 0px; padding: 0px;">}</span></code></pre>
+
+<p><font><font>考虑更有效的方法来实现这一点肯定是值得的。</font></font></p>
+
+<p><font><font>这里要注意的一件事是空闲时间被分类为</font></font><em><font><font>Gecko</font></font></em><font><font>,所以你的配置文件中没有运行JavaScript的部分将贡献</font></font><em><font><font>Gecko</font></font></em><font><font>样本。</font><font>这些与您的网站的性能无关。</font></font></p>
+
+<div class="note">
+<p><font><font>默认情况下,Call Tree不会将平台数据拆分为单独的函数,因为它们会增加很多噪音,并且细节对于不使用Firefox的用户可能不太有用。</font><font>如果您想查看详细信息,请在</font></font><a href="/en-US/docs/Tools/Performance/UI_Tour#Toolbar"><font><font>设置中</font></font></a><font><font>选中“显示壁虎平台数据” </font><font>。</font></font></p>
+</div>
+
+<p> </p>