Skip to content

动作管道性能说明 ​

Emaki 动作管道的性能评估口径如下: 可静态证实的架构优势, 可复现的基准方法与量化结果表.本环境无 Paper/Folia 实机, 量化项一律标注"未执行"并给出关闭条件 -- 架构优势以源码为证, 具体数值必须在实机测得后方可对外引用

架构优势 (源码可证实) ​

1. 编译期固化, 运行期零解析 ​

管道在配置加载期经 PipelineParser + StaticValidator 一次性编译为 CompiledPipeline (AST + 类型化参数校验通过). 运行期 ActionInterpreter 直接执行已编译结构:

  • 不做字符串重新分词, 不做参数类型校验, 不做未知段查找;
  • 参数渲染只对含占位符的值执行 render, 纯字面量跳过;
  • 编译失败在加载期报出全部诊断 (48+ 项规则), 运行期不存在段名写错直至执行才暴露的路径

2. gate 短路与分组调度 ​

  • gate 短路: 源段 Empty, gate Halted 直接进入终态 (stopped), 后续段整段跳过, 不做任何跨域调度;
  • 同域合批: StageGroup 把连续的同域段合为一次调度 (foldable 段可附加到前组), 减少 Folia/Paper 线程切换次数 -- 例如"改背包 + 改经验值"两个 CONTEXT_ENTITY 段只发生一次 owner 线程转移;
  • 五域分级: SERVER_GLOBAL / CONTEXT_ENTITY / LOCATION_REGION / ASYNC_COMPUTE / UNDECLARED 在注册期强制声明 (StageRegistry.checkDomain), 运行期 StageDispatcher 按域分发.竞品普遍没有线程域分级, 这是 Emaki 在 Folia 上的结构性差异

3. 热路径零分配观测 ​

StepReporter 默认实现为 NOOP (接口空方法), 非调试运行时所有观测点为空调用; ActionAuditLogger 无 DebugLogger 时直接返回. 观测基础设施不向生产热路径引入任何分配或分支成本

4. 淘汰优先于执行 ​

每级 gate 的输入/输出计数在 StepReporter.gate 上报 (干跑/调试模式渲染漏斗); 语义上先淘汰后执行 -- filter/where 在动作执行前淘汰不合格目标, 避免对无效目标发起跨域调度

基准方法 (可复现) ​

遵循 .spigot-dev/guides/performance-baseline.md 的采样纪律: 只有同一场景, 同一时长, 同一规模的数据才可对比. 三个必测场景:

场景测什么怎么触发预算目标
管道吞吐每秒完成的管道执行数execute 模式连续跑固定短管道 (如 self | damage amount=1), spark 采样 120s待实机基线后填写
P95 延迟单条管道的端到端延迟分布同上, /spark profiler 方法级采样 ActionInterpreter.walk待实机基线后填写
gate 短路收益Halted/Empty 路径 vs 全通过路径的耗时差对比 filter 'health_percent<=0' (必然全淘汰) 与 filter 'health_percent<=100' (必然全通过)短路路径应显著低于全通过路径

观测命令:

/spark profiler start --timeout 120
# 跑固定场景...
/spark profiler stop --save-to-file

分组调度收益的观测: 在 spark 方法级采样中对比 StageDispatcher.dispatch 的调用次数与被调度段数之比 -- 合批生效时该比值应明显小于 1

量化结果 ​

指标数值采集日期状态
管道吞吐 (条/秒)——未执行
P95 端到端延迟——未执行
gate 短路收益 (短路 vs 全通过)——未执行
合批后 dispatch 次数/段数比——未执行

关闭条件: Paper 26.1 实机按上表三场景各跑一轮 spark 采样, 把数值填回本表并标注采集日期; 在此之前任何量化格都不得填入推测值

与竞品的对比标准 ​

  • 可静态引用 (源码级事实): 五域线程分组与 Folia 域强制声明 (MythicMobs/Skript 无此机制); 编译期 48+ 项诊断 (MythicMobs 靠运行期报错 + Wiki 猜测)
  • 不可引用 (需实机): 任何吞吐, 延迟, TPS 数字. 竞品侧数字同样是营销数据, 对外引用前须复检来源日期