Skip to content

[PERF] 0-kvspace/2-runtime: 句柄缓存(kvspaceResolveRef/GetByRef/SetPartByRef + block_id + forwarding tombstone + 帧级失效) #268

Description

@miaobyte

背景

resolve_path 快速路径(已提交 kvspace-c 639d16c,resolve=1 从 ~12× art_search 降到 1×)之后,稳态每次 key 访问的理论地板已是 1× art_search + 1× DecodeHead(定位 + 验非指针 + 取值)。要再降,只能跳过 root→node 的树下降本身,即缓存句柄。

三判据裁决(profile + art 结构调研已定)

判据 结论 约束
覆盖写迁移? 叶子变量 a 不新增子节点→不 grow,block_id 稳定;但 box 写路径每次 free+alloc,box_offset 会变 可缓存 block_id,不能缓存 box_offset,命中后从节点重读
复用/epoch? 无 epoch/version;block_id 永不复用(不张冠李戴)但 grow 遗弃旧块→静默 stale 必须自建失效,不能靠引擎信号
key 稳定? ✓ 循环内 /vthread/vt0/[d]/a 逐轮字节相同 命中率≈100%,值得做

block_id 换算是乘加两步、位置无关、跨进程/重启有效 → 缓存 block_id 跨 SHM 安全。

设计

新 ABI(不透明句柄):

kvspaceResolveRef(kv, key) -> ref{ block_id, gen }   # 走一次完整下降,建缓存
kvspaceGetByRef(kv, ref, key_fallback, ...)          # 命中: block_id→ptr 一次乘加
kvspaceSetPartByRef(kv, ref, key_fallback, off, ...) #       读 has_value+box_offset,直取

命中校验(无 epoch,用 forwarding tombstone):

  • node grow 搬迁时,旧块写 moved 标记 + 新 block_id;
  • ByRef 命中旧块见 moved → 跟随 forwarding + 刷新 ref;见 has_value=0(被删)→ miss 回退 key;
  • box_offset 不进 ref,命中节点后重读。

kvlang 侧:解析缓存键 = (frame_root, name),帧退出时失效(不能挂帧无关共享 inst,递归会串帧读错值);首次 miss 填 ref,之后直取。

收益:每次访问从「1× art_search + 全下降」→「一次 block_id 乘加 + 读 box_offset」。

风险 / 落地

中高:forwarding tombstone + 帧级失效 + 跨仓 ABI(kvspace-c / kvspace / kvspace-durable / kvlang runtime 四处)。建议先完成 #267再评估此增量收益是否值这个复杂度。

关联 #212#204#203(PC/帧寻址)、kvspace-c #16

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    PERF性能:测量、回归或优化

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions