性能

自 3.2.0 版(测试版)起。

性能标签页用于测量公式求值所花的时间。它会记录每一次求值,并以时间线和表格的形式显示:耗时、调用次数、调用链。您可以看到时间花在了哪里——包括 Ninext 自己触发的调用。

此标签页仅供管理员使用。它只显示一个图标——秒表,位于错误和代码搜索标签页之间;鼠标悬停时会显示其名称。可以在 Ninext 设置的“脚本管理器”部分中停用它:公式性能分析。

开始和停止测量

主按钮开始测量会采用所选开始方式的名称(首次求值时开始、下次点击时开始);测量期间,它会变为停止测量。旁边的小按钮显示所选开始方式和停止方式的图标,它会打开选择启动触发方式菜单,该菜单分为两部分。第一部分决定测量何时开始:

开始方式效果
立即开始点击后立即开始测量。这是默认设置。
首次求值时在下一次公式求值时开始测量,并以该次求值作为时间起点。
下次点击时在下一次点击性能标签页以外的地方时开始测量。在此之前,按钮会变为取消。

第二部分决定测量何时停止:

停止方式效果
手动停止通过停止测量按钮停止。这是默认设置。
10、30 或 60 秒后停止倒计时从测量开始时算起。
求值结束时与“首次求值时”配合提供:该次求值结束时(包括其后续的异步部分)停止测量。
松开鼠标按键时与“下次点击时”配合提供:松开鼠标按键时停止测量。之后以异步方式继续进行的部分不会被测量。

这样,您只需测量自己关心的内容:打开一条记录、点击一个按钮、计算一个视图。这些选择在页面重新加载之前一直有效。

在测量等待其触发条件时,状态行会显示“已就绪——等待触发…”。测量期间,它会显示测量已进行的秒数、已记录的求值次数以及不同公式的数量。

须知

开始新的测量不会清空之前的结果:求值会在多次测量之间累加——在表格、计数和时间线中都是如此——直到点击清空为止。每次测量都会在时间轴上从零开始:因此,相继两次测量的条形会在时间线的开头相互重叠。若要单独查看一次测量,请在开始之前点击清空。

时间线

每次求值都是时间轴上的一个条形。嵌套或同时进行的求值会堆叠在多行上;每个公式都有固定的颜色,半透明的条形表示仍在进行中的求值。足够宽的条形会标出其字段名称(“表 ▸ 字段”),插件发起的调用前面还会加上“Ninext ▸”。视图会实时填充。它最多保留 20,000 次求值:超出部分会有一条说明给出被舍弃的求值次数,这些求值只由表格继续统计。

缩放方式:

  • 鼠标滚轮,或在 Chrome 中用触控板双指捏合,以指针所在位置为中心缩放(双指滑动则为滚动);
  • 双击某个条形会选中它并放大到该条形;
  • 三个按钮:缩放至整个会话、缩小时间刻度和放大时间刻度。

表格

性能分析的表格视图

表格按公式对求值进行汇总:

列内容
公式被测量的公式。
调用次数求值的次数。
总计(毫秒)累计耗时。
平均(毫秒)单次求值的平均耗时。
最大(毫秒)耗时最长的一次求值。

表格按总耗时从高到低排序,每秒更新一次;显示前 100 行,超过时会有一条说明(“显示 100 行,共 N 行——最耗时的在前。”)。超过 1,000 个不同公式时,其余公式会归入一行“……其他公式”。架构中的公式以与字段与公式中相同的方式呈现——面包屑导航、“Fx”、编辑按钮——当同一个公式出现在多个位置时,会附加“+N”。插件发起的调用会带有“Ninext”标记。

求值详情

性能分析中某次求值的详情

点击某个条形或某一行即可打开详情:

  • 公式的完整代码;
  • 对于条形:开始、时长、记录,以及从根求值到此次求值的调用链,链上的每一环都可以点击;对于表格中的一行:测量值(调用次数、总耗时、平均耗时和最大耗时);
  • 来源,适用于 Ninext 发起的调用;
  • 变量(检查),适用于被检查公式的求值(见下文);
  • 公式在架构中的位置,并附有跳转到代码的按钮;
  • 底部为缩放到此次求值和检查此公式。

检查公式

在表格或时间线中选择一个公式,然后点击检查此公式。测量期间,该公式每次求值时,性能分析器都会记录每个用 var 或 let 声明的变量的值:显示值的预览,鼠标悬停时显示其类型。

检查标签页会列出这些求值,最新的在最上面;点击其中一个即可在时间线中找到它。一次只能检查一个公式;停止检查可结束检查。

有两个局限:重新赋值和循环变量不会被记录;而且被检查公式的耗时只能作为参考,因为记录本身也需要时间。

解读数字

  • 耗时是包含式的:一个公式的耗时也包括它所求值的其他公式的耗时。
  • 对于异步求值,耗时一直计算到其结束,包括数据加载。
  • 两个公式完全相同的字段在表格中共用一行。
  • 测量的对象包括公式、触发器、视图的列、控制台中的代码以及 Ninext 的调用。Ninext 自身的 JavaScript 不在测量之列。
  • 测量时每次求值只增加几微秒的开销,不测量时则没有任何开销。结果保存在内存中:页面重新加载后就会消失。