57 lines
1.9 KiB
GDScript
57 lines
1.9 KiB
GDScript
## Simple performance timing helpers for GECS
|
|
## Records results to JSONL files (one JSON per line, one file per test)
|
|
class_name PerfHelpers
|
|
|
|
|
|
## Time a callable and return milliseconds
|
|
static func time_it(callable: Callable) -> float:
|
|
var start_time = Time.get_ticks_usec()
|
|
callable.call()
|
|
var end_time = Time.get_ticks_usec()
|
|
return (end_time - start_time) / 1000.0 # Return milliseconds
|
|
|
|
|
|
## Record performance result to test-specific JSONL file
|
|
static func record_result(test_name: String, scale: int, time_ms: float) -> void:
|
|
var result = {
|
|
"timestamp": Time.get_datetime_string_from_system(),
|
|
"test": test_name,
|
|
"scale": scale,
|
|
"time_ms": time_ms,
|
|
"godot_version": Engine.get_version_info().string
|
|
}
|
|
|
|
# Ensure perf directory exists
|
|
var dir = DirAccess.open("res://")
|
|
if dir:
|
|
if not dir.dir_exists("reports"):
|
|
dir.make_dir("reports")
|
|
if not dir.dir_exists("reports/perf"):
|
|
dir.make_dir("reports/perf")
|
|
|
|
# Append to test-specific JSONL file (one JSON per line)
|
|
var filepath = "res://reports/perf/%s.jsonl" % test_name
|
|
# Check if file exists, if not create it with WRITE, otherwise open with READ_WRITE
|
|
var file_exists = FileAccess.file_exists(filepath)
|
|
var file = FileAccess.open(filepath, FileAccess.READ_WRITE if file_exists else FileAccess.WRITE)
|
|
|
|
if file:
|
|
if file_exists:
|
|
file.seek_end()
|
|
file.store_line(JSON.stringify(result))
|
|
file.close()
|
|
else:
|
|
push_error("Failed to open performance log file: %s (Error: %s)" % [filepath, error_string(FileAccess.get_open_error())])
|
|
|
|
# Print result for console visibility
|
|
prints("📊 %s (scale=%d): %.2f ms" % [test_name, scale, time_ms])
|
|
|
|
|
|
## Optional: Assert performance threshold (simple version)
|
|
static func assert_threshold(time_ms: float, max_ms: float, message: String = "") -> void:
|
|
if time_ms > max_ms:
|
|
var error = "Performance threshold exceeded: %.2f ms > %.2f ms" % [time_ms, max_ms]
|
|
if not message.is_empty():
|
|
error = "%s - %s" % [message, error]
|
|
assert(false, error)
|