P06-01: Show A06 reserve capacity in HUD, add new-PID and perf evidence

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Takeshi
2026-10-19 20:29:04 +09:00
co-authored by Claude Opus 5.5
parent ae0f998ff4
commit 65534cfd15
5 changed files with 249 additions and 1 deletions
@@ -0,0 +1,78 @@
{
"probe": "perf_probe.gd",
"baseline_source": "c366012 (autoload/simulation_runtime.gd, scripts/mana/mana_network_service.gd swapped in place)",
"candidate_source": "working tree after ae0f998 + HUD change",
"runs": [
{
"side": "BASE",
"minutes": 1440,
"save_ms_avg": 18.752,
"save_ms_max": 20.915,
"snapshot_ms_avg": 0.38877,
"tick_day_ms_avg": 1005.434,
"tick_day_ms_max": 1022.47,
"trials": 5
},
{
"side": "CAND",
"minutes": 1440,
"save_ms_avg": 19.2478,
"save_ms_max": 21.626,
"snapshot_ms_avg": 0.39343,
"tick_day_ms_avg": 1013.9146,
"tick_day_ms_max": 1037.407,
"trials": 5
},
{
"side": "BASE",
"minutes": 1440,
"save_ms_avg": 19.9272,
"save_ms_max": 22.122,
"snapshot_ms_avg": 0.39169,
"tick_day_ms_avg": 1010.7658,
"tick_day_ms_max": 1021.417,
"trials": 5
},
{
"side": "CAND",
"minutes": 1440,
"save_ms_avg": 16.6394,
"save_ms_max": 20.276,
"snapshot_ms_avg": 0.39521,
"tick_day_ms_avg": 1016.2724,
"tick_day_ms_max": 1036.077,
"trials": 5
},
{
"side": "BASE",
"minutes": 1440,
"save_ms_avg": 18.8624,
"save_ms_max": 21.534,
"snapshot_ms_avg": 0.38799,
"tick_day_ms_avg": 1007.718,
"tick_day_ms_max": 1034.979,
"trials": 5
},
{
"side": "CAND",
"minutes": 1440,
"save_ms_avg": 15.2772,
"save_ms_max": 17.564,
"snapshot_ms_avg": 0.40309,
"tick_day_ms_avg": 1012.192,
"tick_day_ms_max": 1053.282,
"trials": 5
}
],
"base_mean": {
"tick_day_ms_avg": 1007.973,
"snapshot_ms_avg": 0.389,
"save_ms_avg": 19.181
},
"cand_mean": {
"tick_day_ms_avg": 1014.126,
"snapshot_ms_avg": 0.397,
"save_ms_avg": 17.055
},
"scope": "Ordinary new-game Runtime only, 1440 minutes x5 trials x3 runs, snapshot x20, disk save. Not rendering, Operations-heavy fixtures, or Windows."
}
@@ -0,0 +1,55 @@
extends SceneTree
## P06-01 A06 performance regression probe. Same script runs on the baseline
## and candidate checkouts; prints one JSON line. Measures ordinary Runtime
## minute ticks, full snapshots and disk saves; not rendering or Windows.
const TRIALS := 5
const MINUTES := 1440
const SNAPSHOTS := 20
func _initialize() -> void:
call_deferred("_run")
func _run() -> void:
var tick_ms: Array = []
var snapshot_ms: Array = []
var save_ms: Array = []
for trial: int in TRIALS:
var clock: Variant = load("res://autoload/game_clock.gd").new()
var state: Variant = load("res://autoload/game_state.gd").new()
var runtime: Variant = load("res://autoload/simulation_runtime.gd").new()
clock.reset(1, 6, 0)
state.reset()
runtime.initialize(clock, state, 5505 + trial)
clock.set_paused(true)
var start := Time.get_ticks_usec()
clock.advance_minutes(MINUTES)
tick_ms.append((Time.get_ticks_usec() - start) / 1000.0)
start = Time.get_ticks_usec()
var snapshot: Dictionary
for i: int in SNAPSHOTS:
snapshot = runtime.create_snapshot()
snapshot_ms.append((Time.get_ticks_usec() - start) / 1000.0 / SNAPSHOTS)
var path := "user://saves/p06_01_perf_probe_%d" % trial
start = Time.get_ticks_usec()
var saved: Dictionary = SaveService.save_snapshot(path, snapshot)
save_ms.append((Time.get_ticks_usec() - start) / 1000.0)
SaveService.delete_save(path)
if not saved[&"ok"]:
push_error("save failed")
runtime.free(); clock.free(); state.free()
print("P06_01_PERF=" + JSON.stringify({
"trials": TRIALS, "minutes": MINUTES,
"tick_day_ms_avg": _avg(tick_ms), "tick_day_ms_max": tick_ms.max(),
"snapshot_ms_avg": _avg(snapshot_ms), "save_ms_avg": _avg(save_ms), "save_ms_max": save_ms.max(),
}))
quit(0)
func _avg(values: Array) -> float:
var total := 0.0
for value: float in values:
total += value
return total / values.size()