Files
AtomUI/docs/performances/Form

Form 性能优化

状态:已完成低风险结构与生命周期优化;本轮追加验证路径 structural-only 容量收敛。

追加结构优化:验证集合容量

Form.ValidateAsync() 和 FormItem.ValidateValueAsync() 的任务、结果和消息集合按 Items.Count / Validators.Count 预分配。验证顺序、并发/串行策略、错误/警告消息内容均保持不变。

指标 优化前 优化后 公式 提升 结论
Form validate tasks list / validate dynamic growth exact upper-bound capacity structural 分配更紧 按 Items.Count 预分配
Form validate results list / validate dynamic growth exact upper-bound capacity structural 分配更紧 按 Items.Count 预分配
Form validate messages list / validate dynamic growth exact upper-bound capacity structural 分配更紧 按 Items.Count 预分配
FormItem validator task dictionary / parallel validate dynamic growth exact upper-bound capacity structural 分配更紧 按 Validators.Count 预分配
FormItem warning/error message lists / validate dynamic growth exact upper-bound capacity structural 分配更紧 按 Validators.Count 预分配

说明:这是交互验证路径的结构性收益;不声明页面加载 timing 提升。

追加结构优化:ValidateAsync error result fast path

Form.ValidateAsync() 旧路径会把每个 FormItem.ValidateResult 收集进临时 List<FormValidateResult>,再用 Any(predicate) 判断是否存在错误。本轮改为在收集验证消息的同一轮扫描中维护 hasError,错误 / 警告消息内容和 Validated 事件语义保持不变。

指标 优化前 优化后 公式 提升 结论
Form validate results list allocations / validate 1 list 0 lists (1 - 0) / 1 100.00% 有效;不再为结果归并创建临时 list
Form validate error check LINQ operators / validate 1 Any(predicate) 0 LINQ operators (1 - 0) / 1 100.00% 有效;错误判断并入消息收集循环

说明:这是表单验证交互路径的结构性收益;不声明页面导航 timing 提升。

追加结构优化:Items collection handler

Form 构造器里 Items.CollectionChanged 原先使用匿名 lambda 调用 InvalidateMeasure()。本轮改为命名 method-group handler,行为不变,但每个 Form 实例不再创建匿名 handler,后续排查订阅链也更清晰。

指标 优化前 优化后 公式 提升 结论
Form Items.CollectionChanged anonymous handler / instance 1 0 (1 - 0) / 1 100.00% 有效;改为 HandleItemsCollectionChanged method group
Items change measure invalidation behavior InvalidateMeasure() InvalidateMeasure() n/a 0.00% 行为保持不变

验证说明:AtomUI.Performance 构建通过。当前 --verify-form-states 仍有历史断言/期望失败,本轮不把该 suite 作为收益证明。

追加结构优化:error message inline last lookup

FormItem.BuildErrorMessageInlines() 在 warning message 拼接前需要判断当前最后一个 inline 是否已经是 LineBreak。旧实现使用 inlines.Last();本轮在 inlines.Count > 0 保护下改为 inlines[inlines.Count - 1],错误/警告消息顺序和换行规则保持不变。

指标 优化前 优化后 公式 提升 结论
FormItem warning inline LINQ Last() calls / warning message 1 0 (1 - 0) / 1 100.00% structural-only;最后一个 inline 直接按 index 读取
Error/warning line-break semantics unchanged unchanged n/a 0.00% 行为保持;只在需要时插入分隔换行
Page-load timing claim none none n/a n/a 本轮没有有效前后 timing,不声明页面级速度收益

验证补充:复跑 --verify-form-states 仍失败在既有 feedback control、tooltip icon、debounce timer 和 detach token source 断言;本轮只改错误/警告消息 inline 集合的最后一项读取方式,不改变这些生命周期路径,因此该失败不作为本轮结构优化引入的新回归。