slovo/benchmarks/array-index-loop/README.md
2026-05-22 08:38:43 +02:00

2.8 KiB

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:

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:

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:

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.