docs: 记录属性 key 命中率实测结果 #99

Merged
gjm merged 2 commits from company-desktop/company-desktop-computer/perf-attr-key-hitrate AGit into main 2026-10-28 20:14:40 +08:00
Collaborator

同日第二次跑图(113 s)的数据:属性 key 合计 86.7% 命中,远高于内容 hash 的 54.0%,
其中 AecDbEwPipe 84.1%(173 种唯一)、AecDbEwPipeBase 99.7%(仅 3 种唯一),
证实"同数据的管子/管件截面必然相同"这个业务前提。

同时记录覆盖率限制:属性 key 只能覆盖 EwPipe::RegionAcisIn 这条路径(3082/5641 次),
另外 2559 次走 CoreTools::StringToRegion(设备、保温等),无 spec 数据,只能用内容 hash。
据此把 Phase 1 定为混合策略,并给出预计收益:省 14.9 s / 22.6 s 恢复开销,
约占开图的 13%。

留一个明确的未验证点:属性 key 命中时两份 SAT 文本是否真的相同;
若存在同数据不同文本(旧版本存盘、不同代码路径),直接复用有风险,
需要 textHash 兜底校验,该项在 Phase 1 实现时顺带统计。

同日第二次跑图(113 s)的数据:属性 key 合计 86.7% 命中,远高于内容 hash 的 54.0%, 其中 AecDbEwPipe 84.1%(173 种唯一)、AecDbEwPipeBase 99.7%(仅 3 种唯一), 证实"同数据的管子/管件截面必然相同"这个业务前提。 同时记录覆盖率限制:属性 key 只能覆盖 EwPipe::RegionAcisIn 这条路径(3082/5641 次), 另外 2559 次走 CoreTools::StringToRegion(设备、保温等),无 spec 数据,只能用内容 hash。 据此把 Phase 1 定为混合策略,并给出预计收益:省 14.9 s / 22.6 s 恢复开销, 约占开图的 13%。 留一个明确的未验证点:属性 key 命中时两份 SAT 文本是否真的相同; 若存在同数据不同文本(旧版本存盘、不同代码路径),直接复用有风险, 需要 textHash 兜底校验,该项在 Phase 1 实现时顺带统计。
company-desktop added 2 commits 2026-10-28 20:06:12 +08:00
意图:内容 hash 只看到 54% 命中率,但业务上"同数据的管子/管件截面必然相同",
所以要用实体属性做 key 再量一次,决定 Phase 1 到底用哪种缓存键。

新增 SectionPerf::AttrKey(RAII):
- 构造时按类名(isA()->name())初始化 hash 与统计桶,析构时记一次
- Add() 增量喂字节,调用方决定哪些字段参与 key
- 统计按实体类分开(total / unique / hits / hit_rate)

接入 AecDbEwPipeBase::RegionAcisInDwgInFields:key = 类名 + 全部 spec XData,
但排除编号("No.",每根管子唯一)并跳过 Id / 点 / 向量 / 矩阵 / 二进制类型
(与截面无关或随实体变化)。只在 AEC_PERF_COUNTER=1 时构建,Release 无开销。

实测(big1.dwg,AutoCAD 2020 / R230 Debug,113 s 开图):

  属性 key 合计 3082 次 / 2672 命中 = 86.7%
    AecDbEwPipe       1088 次  173 唯一  84.1%
    AecDbEwPipeBase   1172 次    3 唯一  99.7%
       (其余类 43%~99%)
  内容 hash 54.0%

结论:属性 key 显著优于内容 hash,但只覆盖 3082/5641 次恢复
(另 2559 次走 CoreTools::StringToRegion,拿不到 spec 数据,只能用内容 hash)。
混合策略预计省 14.9 s / 22.6 s 恢复开销,约占 113 s 开图的 13%。

数据已写入 pipe-section-region-performance-plan.md,并标注一个未验证点:
属性 key 命中时两份 SAT 文本是否真的相同(决定 Phase 1 是否需要 textHash 兜底校验)。

验证:R230 Debug 编译通过并部署,用 tools/run_acad_perf.ps1 自动跑图取数。
同日第二次跑图(113 s)的数据:属性 key 合计 86.7% 命中,远高于内容 hash 的 54.0%,
其中 AecDbEwPipe 84.1%(173 种唯一)、AecDbEwPipeBase 99.7%(仅 3 种唯一),
证实"同数据的管子/管件截面必然相同"这个业务前提。

同时记录覆盖率限制:属性 key 只能覆盖 EwPipe::RegionAcisIn 这条路径(3082/5641 次),
另外 2559 次走 CoreTools::StringToRegion(设备、保温等),无 spec 数据,只能用内容 hash。
据此把 Phase 1 定为混合策略,并给出预计收益:省 14.9 s / 22.6 s 恢复开销,
约占开图的 13%。

留一个明确的未验证点:属性 key 命中时两份 SAT 文本是否真的相同;
若存在同数据不同文本(旧版本存盘、不同代码路径),直接复用有风险,
需要 textHash 兜底校验,该项在 Phase 1 实现时顺带统计。
gjm approved these changes 2026-10-28 20:14:36 +08:00
gjm merged commit 28dd149f2f into main 2026-10-28 20:14:40 +08:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gjm/envi-code#99