# Enum Struct Payload Loop Benchmark Scaffold

Release: `exp-122`.

This benchmark compares enum payload selection, enum `match`, and immutable
fixed-array access through a struct payload plus scalar accumulation across
Slovo, C, Rust, Python, Clojure, and Common Lisp/SBCL on the same machine.

It is not a published benchmark result, performance threshold, optimizer
claim, or cross-machine comparison.

## Files

- `src/main.slo`: Slovo project benchmark fixture
- `c/enum_struct_payload_loop.c`: C comparison implementation
- `rust/enum_struct_payload_loop.rs`: Rust comparison implementation
- `python/enum_struct_payload_loop.py`: Python comparison implementation
- `clojure/enum_struct_payload_loop.clj`: Clojure comparison implementation
- `common-lisp/enum_struct_payload_loop.lisp`: Common Lisp/SBCL comparison implementation
- `run.py`: build/run/timing harness

All implementations print checksum `3500013` for loop count `1000000`.
Hot-loop mode uses loop count `10000000` and checksum `35000013`. The runner
supplies the loop count at runtime so native compilers cannot fold the loop
into a constant answer.

## Commands

Run from the Glagol repository root:

```bash
python3 benchmarks/enum-struct-payload-loop/run.py --list
python3 benchmarks/enum-struct-payload-loop/run.py --dry-run
python3 benchmarks/enum-struct-payload-loop/run.py --only python --repeats 3 --warmups 1
python3 benchmarks/enum-struct-payload-loop/run.py --mode hot-loop --only slovo --only c --only rust
```

To include Slovo, build or point at a Glagol binary and make sure host Clang is
available:

```bash
cargo build --manifest-path compiler/Cargo.toml --bin glagol
python3 benchmarks/enum-struct-payload-loop/run.py --glagol compiler/target/debug/glagol
```

The runner skips missing C/Rust/Slovo/Clojure/SBCL toolchains where possible.
Use `--only` multiple times to select implementations:

```bash
python3 benchmarks/enum-struct-payload-loop/run.py --only slovo --only c --only rust --only clojure --only common_lisp
```

Clojure is detected with `clojure` on PATH, `CLOJURE`, or `CLOJURE_JAR`.
Common Lisp is detected with `sbcl` on PATH, `SBCL`, or `--sbcl`.

## Comparison Method

- The runner builds each implementation once before timing. The reported
  numbers measure execution only, not compile time.
- Slovo timings use `glagol build`, which currently lowers to LLVM and then
  invokes host `clang -O2` with `runtime/runtime.c`.
- C timings use `clang -O2 -std=c11`.
- Rust timings use `rustc -C opt-level=3 -C debuginfo=0`.
- The measured loop alternates between two enum payload variants, matches the
  selected variant, reads one fixed `i32` array through the bound struct
  payload, and accumulates the selected value into an `i32` checksum.

Timing is cold-process local-machine evidence only. Clojure timings include
JVM and Clojure startup, while Common Lisp timings include SBCL script
startup.

Hot-loop mode is startup-amortized local evidence. It runs a larger loop count
and reports total time plus normalized time for the base `1000000` loop count.
