perf(core): [MOD-03] avoid redundant slider attribute writes

This commit is contained in:
Harvey Zhao committed 2026-09-14 15:44:18 +08:00
1 parent 7b0e1d156b
commit 23a4f22b72
18 files changed
+6012 -28

No files matched your search

@@ -0,0 +1,64 @@
# MOD-03 进度与音量 ARIA 更新检查点
MOD-03保持doing。本轮处理已经进入播放热路径的重复DOM写入,尚未完成该任务要求的
初始化、持久化、全部DOM读写及正式安装包BASE-06配对验收。ENG-PERF-01/02不关闭。
## 实现与兼容边界
`accessibility/slider.ts`每次刷新仍读取完整range、校验有限数值并计算显示文本。
仅把五个动态ARIA属性改成与当前getAttribute值比较后再写入;辅助函数不导出,
不添加实例字段、不跨事件缓存、不延后更新。外部修改或删除属性仍在下一刷新修复。
范围/步长/禁用逻辑、键盘动作、焦点、公开媒体/进度事件、声明及DOM/CSS名称保持。
这是减少冗余DOM变更的内部优化。观察这些ARIA属性的MutationObserver将不再收到
值完全不变的重复记录,实际值变更仍会记录;不能声称MutationObserver记录序列
完全不变。这些键盘ARIA是本次重构增加的能力,不是静默删掉已发布的播放器事件。
没有修改公共setStyle、Storage方法、autoPlayback写入频率或原生媒体时钟。
不缓存上次range:它可能由外部代码改变,不缓存已写文本:外部代码可能修改DOM。
这样保留动态行为,代价是每次仍进行五次轻量属性读取;不产生布局尺寸读取。
## 验证设计
Node新用例在旧源码明确失败:重复update产生10次属性写入;其余10项旧键盘/范围/
清理用例通过。新实现11项通过,并覆盖只改变小数值、显示文本改变、外部DOM修复、
每次调用文本格式器及销毁后无更新。全项目2859项单元测试通过,严格核心TS和lint通过。
`test/browser/slider-updates.spec.js`默认验证当前候选,显式
ARTPLAYER_SLIDER_BASELINE增加修改前真实产物对照。每个引擎运行三组,按旧新/新旧/
旧新顺序;两边使用相同本地pattern.mp4和viewport,各自重新导航、创建并实际播放。
旧产物冻结自Git `7b0e1d156b8e21e422200ee345afa63950f9d5a2`,不是npm发布基线。
旧脚本通过单个路由替换,附件单独保存该文件和SHA;server manifest仍描述候选路由
原始文件,不能将其误当为替换后旧脚本的身份。
计时阶段暂停原生video,预热300个合成timeupdate,再记录五组各1000次的原始耗时。
没有在计时循环安装MutationObserver。随后单独用原生观察器统计100次重复事件,
验证公开订阅仍收到每次事件,并核对外部ARIA改写恢复。最后恢复真实播放,观察
真实timeupdate和ARIA数值,静态范围属性不应重复写入。这些计时只代表合成重复
事件的执行成本,不是帧率、输入延迟或真实页面端到端性能。
main/legacy各三引擎×三组通过;全部重复事件窗口均由500次ARIA写入降到0,
外部修复由5次降到2次,实际播放继续更新valuenow。主构建真实播放窗口中,旧版
4–5个媒体事件产生20–25次属性变更,候选相应窗口为4–5次;窗口事件数并非全部
相等,因此不以合计总数计算统一百分比。
主构建1000次合成事件的各组中位数:Chromium旧4.6–5.2ms、新3.2–3.6ms;
Firefox旧9–10ms、新7–8ms;WebKit旧9–10ms、新7–10ms,其中第二组候选10ms
比旧9ms慢。保留所有原始样本,不把操作数量下降等同所有环境计时都改善。
legacy的完整配对值同样保留在机器记录中,不按有利组筛选。
## 构建成本与继续工作
由正常`yarn build artplayer --analyze`和`yarn build:i18n`生成三种产物及docs副本,
没有手写产物。相较修改前,现代raw +12/gzip9 +10/Brotli6 +12字节;legacy
+12/+17/+11;ESM +154/+34/+44。此项是热路径更新优化,不是体积优化。
现代当前208943 raw / 58756 gzip9仍高于已发布5.4.0的134037 / 35486,原阈值不变。
本次浏览器验收包含普通键盘/进度/音量及回调清理,具体最终执行范围、报告和文件
指纹见[机器记录](../baselines/slider-updates-validation.json)。未运行此次候选的完整
真实安装/初始化配对、物理设备或远端CI;旧安装证据不自动覆盖此次候选。
接下来继续MOD-03的持久化/初始化/布局测量,再使用新的实际安装包完成正式三组
BASE-06性能/资源对比。不能通过提高阈值、节流公开事件、延迟销毁或删除兼容逻辑
制造收益。回退本检查点并正常重建核心/i18n可恢复旧的冗余写入行为;不涉及依赖、
版本或公开声明变更,没有推送或发布。