Skip to the content.

缓存治理与敏感字段的性能记录

2026-10-15,Windows 10.0.19045、.NET 10.0.13、6 个逻辑处理器,Release 单线程。以下测量针对当前组件增量,生产实现对应提交 953596e;没有把 Redis、数据库或日志输出 I/O 混入数值。原始汇总见 JSON,复现入口见 基准程序。

缓存封装与监测

场景 中位数 ns/次 分配 B/次 采样 P95 ns
原生命中 99.1 0 200
治理命中,预建键 112.2 0 300
原生未命中,含 Remove 698.3 464 2,000
治理未命中,含 Remove 836.3 488 2,900
治理绕过 17.0 0 100
新建类型/Scope 隔离键 774.0 600 1,400
治理命中,有 MeterListener 105.8 0 未采样

预建键命中增加约 13.1ns(13.2%),没有额外分配。未命中增加约 138ns 和 24B,包含治理层源加载状态、预算与采集,以及删除操作;它不是纯源读取成本。每次重建键有独立的摘要与分配成本,不能把“预建键命中 0B”扩展为所有调用 0B。

启用空监听回调的结果略低于无监听结果,说明这一级别存在 JIT/测量顺序和环境波动,不能据此宣称监听会加速。它只验证监听情况下的开销量级与零额外分配,不包含真实收集器聚合、导出序列化和网络。实际 OpenTelemetry 订阅/导出链路由独立集成验证确认可用。

这里使用不可变字符串,未测大 DTO、原生序列化克隆成本、真实 Redis 延迟/吞吐或高并发失效。回源预算及并发合并有功能验证,但本轮不以微基准声明生产容量。

敏感字段

场景 中位数 ns/次 分配 B/次 采样 P95 ns
手机号掩码 22.8 48 100
邮箱掩码 75.9 80 500
手写受保护字段投影 206.7 480 1,200
属性驱动受保护投影 219.6 480 1,600
预处理 DTO 的普通 JSON 301.2 176 1,000
原 DTO 的标记驱动 JSON 414.5 304 1,200
普通日志,关闭级别 34.9 32 100
受保护日志,关闭级别 3.4 0 100
受保护日志,启用级别 274.2 624 900

属性驱动投影相对手写同样掩码、同样字段的字典增加约 12.9ns,分配相同。JSON 对照输出字节相同,自动保护增加约 113.3ns(37.6%)和 128B;增量来自输出时计算掩码及 getter 适配,不能用较少输出字段掩盖它。

普通日志关闭级别的对照仍构造日志参数数组;受保护入口先检查级别,所以没有 DTO 读取和分配。启用日志只测试创建与提交安全状态,没有 formatter、NLog/Serilog sink 或文件/网络 I/O。这些结果不能说明生产日志写入速度。

首次调用 Project 约 19.8ms,包含 JIT、字段计划和运行时访问器编译;热路径数值不包括这项成本,也不能假定所有类型首次耗时一致。对首请求敏感的宿主应在启动阶段准备要用的 DTO/序列化元数据,并单独验证启动时间。反射投影与 JSON 分类适配尚未通过 AOT/裁剪发布验收。

审计采集增量

三个变化字段 采集中位数 分配
普通字段 59.7µs 9,384B
Phone/Email/Secret 分类 58.4µs 9,712B

测量在 EF SavingChanges 回调入口取样,然后抛出受控异常阻止 SQL,采集器照常恢复状态并移除暂存明细。模型和原值来自真实关系上下文;每次仅一个实体、三个字段变化。这里只隔离采集与差异生成,不统计异常处理或事务提交。

受保护路径增加 328B,耗时差异在此次样本与预热顺序下不能归因为性能收益。不能宣称字段保护使审计更快。它也没有解决前一轮 PostgreSQL 同事务审计性能未达标 的提交瓶颈;该验收结论仍然有效。

证据范围

批次中位数来自 7 轮、每轮 100,000 次;采样 P95 每 128 次记录一次,包含时间戳开销,尤其不适合给几十纳秒操作作严格尾延迟承诺。分配取当前线程差值,后台工作和完整请求的分配不在这个口径内。审计另测 2,000 次取中位数。

组件/集成验证覆盖空值命中、类型和 Scope 隔离、同键合并、预算释放、共享后端契约、实时撤权、原值不变、JSON/日志/CSV 保护、同掩码真实变化及敏感主键拒绝。共享后端契约使用测试实现,不能算 Redis 故障或容量验证。

RBAC 按宿主选择每次实时查库,撤权一致性因此不依赖缓存;授权查库带来的端到端成本仍需在实际数据库与业务负载中评估。组件热路径、外部依赖性能和业务一致性是不同验收维度。