56 lines
1.8 KiB
GDScript
56 lines
1.8 KiB
GDScript
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()
|