# 性能表现

性能是编辑器应用的关键特性，块编辑器也不例外。

## 指标衡量

为确保块编辑器在版本迭代和开发过程中始终保持高性能，我们通过[性能基准测试任务](#性能基准测试任务)监控以下核心指标：

部分关键指标包括：

- **加载时间：** 编辑器页面加载所需时长。涵盖服务器响应时间、首次绘制时间、首次内容绘制时间、DOM内容加载完成时间、页面完全加载时间以及首区块渲染时间（文章与站点编辑场景均包含）。
- **输入响应时间：** 在编辑器中输入时浏览器作出响应所需时长。
- **区块选择时间：** 用户选择区块后浏览器作出响应所需时长（插入区块等效于选择区块，监控选择操作即可同步覆盖这两项指标）。

## 关键性能决策与解决方案

**数据模块异步模式**

WordPress组件库与块编辑器的数据模块基于Redux构建。这意味着状态全局存储，当状态发生变化时，依赖该状态的组件（UI）会相应更新。

随着渲染组件数量增加（例如长文编辑时），由于全局状态会向所有组件分发事件，性能将受到影响。这是Redux应用的常见问题，Gutenberg通过数据模块异步模式解决了这一难题。

异步模式的核心在于：开发者可自主决定以同步或异步方式刷新/重渲染React组件树的特定部分。

在此语境下，异步渲染意味着当全局状态触发变更时，订阅者（组件）不会立即被同步调用，而是等待浏览器进入空闲状态后再执行React树更新。

基于**编辑特定区块时，该区块的更新极少影响内容其他部分**这一理念，块编辑器画布仅以同步模式渲染当前选中区块，其余所有区块均采用异步渲染。这确保了随着文章内容增长，编辑器仍能保持流畅响应。

## 性能基准测试任务

我们提供了跨分支/标签/提交进行性能对比的工具。可通过以下方式本地运行：`./bin/plugin/cli.js perf [分支名]`，例如：

```
./bin/plugin/cli.js perf trunk v8.1.0 v8.0.0
```

为获得最精确结果，运行测试时必须确保测试版本与环境（主题等）完全一致，各分支间唯一差异应为Gutenberg插件版本（或用于构建插件的分支）。

为实现该目标，指令会先创建以下目录结构：

    │
    ├── tests/packages/e2e-tests/specs/performance/*
    │   待运行的实际性能测试
    │
    ├── tests/test/emptytheme
    │   测试环境所用主题（站点编辑器）
    │
    │── envs/branch1/.wp-env.json
    │   branch1的wp-env配置文件（除插件目录外与其他分支配置相同）
    │── envs/branch1/plugin
    │   branch1的Gutenberg插件构建副本（通过git checkout branch1获取）
    │
    └── envs/branchX
        所有其他分支均复制perf-envs/branch1的目录结构

完成目录准备后，性能测试指令将循环执行各性能测试套件（文章编辑器与站点编辑器），并执行以下操作：

1. 启动`branch1`对应环境
2. 运行当前套件的性能测试
3. 停止`branch1`对应环境
4. 对其余所有分支重复前三步操作
5. 计算当前套件所有性能指标的中位数值

所有测试套件执行完毕后，将生成汇总报告。

## 通过CodeVitals追踪性能

每次提交的性能结果将推送至codevitals，可在[Gutenberg数据看板](https://www.codevitals.run/project/gutenberg)查看。通过趋势图可追踪特定指标随时间的变化情况。

因此确保所计算指标的稳定性至关重要。这意味着在代码与环境相同的情况下，重复运行测试应获得相近结果。

由于性能任务运行于GitHub CI环境，我们不能完全相信两次相似任务运行获得的数值一致性。例如GitHub CI可能随时间推移分配不同的CPU与内存资源。为缓解此问题，每次在trunk分支运行性能任务时，我们会将当前提交的性能与固定的参考提交哈希进行对比，这样无论环境如何变化，都能持续追踪当前提交与参考提交间的相对差异。

### 更新参考提交

Gutenberg仅支持两个WP版本，这对性能任务产生两方面影响：

 - 当Gutenberg支持的最低版本变更时，用于运行性能任务的基础WP版本需同步更新。为此，我们依赖插件`readme.txt`文件中的`Tested up to`标识。每次该标识变更时，性能任务所用版本也会相应调整。

 - 更新性能任务使用的WP版本意味着，用于保证性能测试稳定性的参考提交很可能与当前WP版本不兼容。因此每次`readme.txt`中的`Tested up to`标识更新时，必须同步更新`.github/workflows/performance.yml`中使用的参考提交。

新选的参考提交哈希需满足以下要求：

 - 与`Tested up to`标识使用的新WP版本兼容
 - 已在codevitals.run平台追踪所有现有指标

当发布涉及最低WordPress版本要求变更的插件更新时，需更新Core SVN中失去支持分支的端到端测试GitHub Action工作流，否则该分支在发布后的首次工作流运行将会失败。

可通过在测试矩阵中添加`gutenberg-version`输入来固定工作流中使用的插件版本。[Core-59221](https://core.trac.wordpress.org/changeset/59221)展示了6.4分支的此类变更示例。

**注意：** 请始终使用包含错误修复的最终发行版（例如`x.y.2`或`x.y.3`）。若最终发行版尚未确定，请创建[Trac工单](https://core.trac.wordpress.org/ticket/62488)以免遗忘。

**选择提交的简易方法是选取trunk分支上最近一次通过性能测试的提交。**

## 拓展阅读

-   [高性能编辑器的演进之路](https://riad.blog/2020/02/14/a-journey-towards-a-performant-web-editor/)