73 lines
2.8 KiB
Markdown
73 lines
2.8 KiB
Markdown
# Array Index Loop Benchmark Scaffold
|
|
|
|
Release: `exp-119`.
|
|
|
|
This benchmark compares immutable fixed-array indexing 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/array_index_loop.c`: C comparison implementation
|
|
- `rust/array_index_loop.rs`: Rust comparison implementation
|
|
- `python/array_index_loop.py`: Python comparison implementation
|
|
- `clojure/array_index_loop.clj`: Clojure comparison implementation
|
|
- `common-lisp/array_index_loop.lisp`: Common Lisp/SBCL comparison implementation
|
|
- `run.py`: build/run/timing harness
|
|
|
|
All implementations print checksum `3875007` for loop count `1000000`.
|
|
Hot-loop mode uses loop count `10000000` and checksum `38750007`. 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/array-index-loop/run.py --list
|
|
python3 benchmarks/array-index-loop/run.py --dry-run
|
|
python3 benchmarks/array-index-loop/run.py --only python --repeats 3 --warmups 1
|
|
python3 benchmarks/array-index-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/array-index-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/array-index-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 keeps one fixed immutable `i32` array in local scope,
|
|
indexes it with a loop-carried `% 8` position, 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.
|