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()