slovo/benchmarks/math-loop/src/main.slo
2026-05-22 08:38:43 +02:00

57 lines
1.5 KiB
Plaintext

; Benchmark scaffold fixture for local-machine timing comparisons only.
; Keep LOOP_COUNT and EXPECTED_CHECKSUM aligned with the C/Rust/Python fixtures.
; The runner supplies the loop count through stdin so native compilers cannot
; fold the benchmark loop into a constant answer.
(module main)
(fn loop_count () -> i32
1000000)
(fn expected_checksum () -> i32
5000001)
(fn parse_stdin_loop_count () -> (result i32 i32)
(let input (result string i32) (std.io.read_stdin_result))
(match input
((ok text)
(std.string.parse_i32_result text))
((err code)
(err i32 i32 code))))
(fn parse_arg_loop_count () -> (result i32 i32)
(std.string.parse_i32_result (std.process.arg 1)))
(fn configured_stdin_loop_count () -> i32
(let parsed_stdin (result i32 i32) (parse_stdin_loop_count))
(if (is_ok parsed_stdin)
(unwrap_ok parsed_stdin)
(loop_count)))
(fn configured_loop_count () -> i32
(let parsed_arg (result i32 i32) (parse_arg_loop_count))
(if (is_ok parsed_arg)
(unwrap_ok parsed_arg)
(configured_stdin_loop_count)))
(fn math_loop ((limit i32)) -> i32
(var i i32 0)
(var acc i32 1)
(while (< i limit)
(set acc (+ acc (* (+ i 3) 2)))
(set acc (if (> acc 1000000000)
(- acc 1000000000)
acc))
(set i (+ i 1)))
acc)
(fn main () -> i32
(let result i32 (math_loop (configured_loop_count)))
(std.io.print_i32 result)
(if (= result (expected_checksum))
0
1))
(test "math loop checksum is deterministic"
(= (math_loop (loop_count)) (expected_checksum)))