更正上一提交:争抢是 1.5x 不是 3.3x,并发现按币绑 worker 可省三分之一

上一提交的 3.3x 基线是废的:离线每次喂同一窗口,append_bar 一根没追
(实测 6 次调用 stream 2001→2001 零增长),测的只是信号链地板 30ms,
拿它比在场 inner_ms 又是一次口径不对齐——和刚撤回的 22/86 同一类错。

对齐后:在场每次平均追 2.81 根(2 worker 各存一份缓存、各自漏掉对方
处理过的根),离线同口径 67.3ms,在场 100ms → 争抢 1.49x。
顺带修正「重建占 21.5%」:真重建只有 0.31%,此前把换 worker 的小幅
回退误判成重建。

新杠杆:symbol 固定到同一 worker,每次只追 1 根,离线 67.3 → 45.0ms,
在场约省 33ms/币(inner_ms 三分之一)。心跳判定改指这一刀。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 16:23:02 +08:00
co-authored by Cursor
parent cef894376c
commit af029bc26e
2 changed files with 45 additions and 16 deletions
+6 -6
View File
@@ -874,13 +874,13 @@ class Shadow:
if not INCR_ON:
return (f"币数 {len(SYMS)} > 核数 {CORES},加 worker 无用(CPU 密集)"
f"。压单币耗时 → 开 SHADOW_INCR=1 走增量(实测 3.56x")
# 增量已生效时,单币耗时的大头不再是算法而是争抢:离线同一窗口 30ms,
# 在场 100ms,注入合成负载能复现这个倍数(HANDOFF §5.72)。所以这里不能
# 再推荐「继续改算法」——那是按 3.3 倍虚高的数去优化 30ms 的真实计算
# 增量已生效时(§5.72 口径对齐后):单币 100ms ≈ 信号链 30ms + 追加
# 2.81 根 37ms + 争抢 33ms。争抢只有 1.49x,加核收益有限;而追加那 37ms
# 里约 22ms 纯属浪费——symbol 随机落 worker,各缓存都漏掉对方处理的根
return (f"币数 {len(SYMS)} > 核数 {CORES},增量已生效,加 worker 无用"
f"worker 已等于核数)。单币 {i:.0f}ms 里真实计算约 30ms"
f"其余是 {CORES} 核上争抢的放大 —— 杠杆是加核或减币"
f"不是继续压算法")
f"worker 已等于核数)。单币 {i:.0f}ms 里争抢只占约 1.5x"
f"最便宜的一刀是按币绑定 worker(每次只追 1 根,省约三分之一)"
f"其次是 add_indicators 增量化")
async def run(self) -> None:
await self.start()