How Does Kit Stack Up, Revisited?

Six Months, 140 Releases, and a New Machine Later

Back to Blog

This is a follow-up to How Does Kit Stack Up? Performance Benchmarks vs Go, Rust, Zig, and More from January 17, 2026.

Back in January we benchmarked Kit against Go, Rust, Zig, V, Crystal, Nim, Node.js, Python, and Ruby, and Kit came out looking very good. That was nearly six months ago—172 days, to be exact—and a lot has happened since. At the time, Kit didn't even have a tagged release yet. Today, 140 tagged releases later (from the first, 2026.3.7, through the current 2026.7.8), the compiler, the runtime, and the benchmark suite itself have all changed. So we ran everything again.

Goodbye, Mac Mini

The biggest change isn't in the software at all. The original benchmarks ran on a trusty 2018-era Intel Mac mini—a Core i7-8700B with 6 cores and 64 GB of RAM. It served well, but it has been retired in favor of a considerably more modern machine: a Corsair AI Workstation 300 built around AMD's Ryzen AI Max+ 395, with 16 cores / 32 threads boosting past 5 GHz, 128 GB of LPDDR5X RAM, and Ubuntu 24.04 instead of macOS.

That means the absolute numbers below are not directly comparable to January's. Everything got faster—a seven-year CPU generation gap will do that. What is worth comparing is how the languages rank against each other, and there the story has some genuine surprises.

Test Environment

  • Device: CORSAIR AI WORKSTATION 300
  • CPU: AMD RYZEN AI MAX+ 395 w/ Radeon 8060S, 16 cores / 32 threads, up to 5.19 GHz
  • Memory: 128 GB LPDDR5X-8000 (124 GiB usable)
  • OS: Ubuntu 24.04.4 LTS (Linux 6.17)

The methodology has tightened up too. All timings now come from hyperfine, and on Linux the run scripts pin benchmark processes to a fixed set of physical cores (taskset -c 2-5) so scheduler placement doesn't skew run-to-run results. Toolchains are current as of this post: Kit 2026.7.8, Zig 0.16.0, Go 1.26.4, Rust 1.96.1, Node.js 26.4.0, Crystal 1.20.3, Nim 2.2.10, V 0.5.1, Python 3.14.6, and Ruby 4.0.5.

A Note on Benchmarks

The same caveats as last time apply. Benchmarking is tricky business: results vary based on hardware, OS, compiler versions, and how idiomatic the code is for each language. These numbers give you a general sense of performance characteristics, not definitive proof that one language is universally "faster" than another.

We encourage you to run these benchmarks yourself. The full source code is available in our kit-benchmarks repository.

Fibonacci Recursion

Same test as January: a naive recursive fib(45), stressing function call overhead and recursion performance.

The Results

Language Mean Time vs Fastest
Nim 0.893s 1.00x (fastest)
V 1.097s 1.23x slower
Kit 1.946s 2.18x slower
Rust 2.088s 2.34x slower
Zig 2.097s 2.35x slower
Crystal 3.237s 3.62x slower
Go 3.469s 3.88x slower
Node.js 6.722s 7.53x slower
Ruby 52.460s 58.75x slower
Python 53.432s 59.84x slower
Fibonacci fib(45) Execution Time
Lower is better. Ruby (52.5s) and Python (53.4s) omitted for scale.

Kit's absolute time dropped from 3.85s to 1.95s—but so did everyone's; that's the hardware, not the compiler. The interesting change is the leaderboard: Nim, which was 4.4x slower than Kit on the Mac mini, is now the fastest language in the field, with V close behind. Kit slipped from first to third, though it still edges out Rust, Zig, and Go. Honest takeaway: Kit remains firmly in the systems-language pack on recursive workloads, but the January "fastest overall" crown is gone—newer Nim and V toolchains on this CPU clearly hit an optimization sweet spot.

Pi Calculation

The Leibniz series pi calculation is back, with one important change: the workload was reduced from 100 million iterations to 10,000, which moves the timings from seconds into microseconds. That makes this round not comparable to January's pi numbers, and at these durations process startup noise is a real factor. Treat it as a short-loop-plus-startup test rather than a sustained floating-point test.

The Results

Language Mean Time vs Fastest
Zig 131.3µs 1.00x (fastest)
V 175.3µs 1.34x slower
Nim 177.5µs 1.35x slower
Rust 246.0µs 1.87x slower
Kit 331.1µs 2.52x slower
Go 369.9µs 2.82x slower
Crystal 464.0µs 3.53x slower
Python 5.881ms 44.79x slower
Node.js 13.450ms 102.43x slower
Ruby 25.025ms 190.58x slower
Pi Calculation (10,000 iterations)
Lower is better. Python (5.9ms), Node.js (13.5ms), and Ruby (25ms) omitted for scale.

Zig takes the top spot, with Kit landing mid-pack among the compiled languages at 2.52x. Kit's tail-recursive loop still compiles down to a native loop—no list allocation, no stack growth—but at the microsecond scale, binary startup overhead separates the field more than raw arithmetic does. Notably, V, Nim, and Crystal, which trailed badly in January's long-running version of this test, are now competitive.

New: Ray Tracer

The benchmark suite has grown since January. The first addition is a deterministic ray tracer that renders a 120×80 sphere scene and prints a checksum of the gamma-corrected pixels. It exercises floating-point vector math, records/structs, branch-heavy intersection code, recursive reflection rays, and nested image traversal—much closer to real-world numeric code than fib or pi.

The Results

Language Mean Time vs Fastest
Zig 633.5µs 1.00x (fastest)
V 684.0µs 1.08x slower
Rust 788.4µs 1.24x slower
Crystal 975.4µs 1.54x slower
Nim 988.0µs 1.56x slower
Go 1.183ms 1.87x slower
Kit 12.950ms 20.44x slower
Node.js 23.468ms 37.05x slower
Python 64.111ms 101.20x slower
Ruby 93.375ms 147.40x slower
Ray Tracer (120×80 scene)
Lower is better. Node.js (23.5ms), Python (64.1ms), and Ruby (93.4ms) omitted for scale.

No sugarcoating this one: at 20x slower than Zig, the ray tracer is Kit's weakest result and its clearest optimization target. Kit still beats every JIT-compiled and interpreted language handily, but the gap to the systems-language pack comes from record-heavy code paths that don't yet stay out of the allocator the way the vec3 benchmark below does. This is exactly the kind of workload the record monomorphization work is chasing, and we expect this number to fall in future releases.

New: Vec3 Record Loop

Which brings us to the second addition: a 100-million-iteration tail-recursive loop that carries a Vec3 record ({x, y, z: Float}) through add/scale/dot helper functions, Kit vs Zig head-to-head. This stresses record monomorphization. As of Kit 2026.7.8, all-primitive-field records pass through monomorphized functions as native structs in registers—instead of heap-allocating on every helper call.

The Results

Language Mean Time vs Fastest
Kit 128.1ms 1.00x (fastest)
Zig 132.5ms 1.03x slower

Kit actually edges out Zig here—300 million helper calls passing records with zero heap allocations. When the unboxing optimization applies, Kit's functional record code runs at native struct speed. The ray tracer above shows what happens on paths where it doesn't yet apply; this benchmark shows where it's headed.

New: FFI

The final addition calls C's sqrt() 100 million times, accumulating the result, to measure foreign function interface overhead—Kit vs Zig, Go, and Rust.

The Results

Language Mean Time vs Fastest
Rust 39.7ms 1.00x (fastest)
Zig 39.8ms 1.00x
Go 1.807s 45.49x slower
Kit 1.976s 49.74x slower

An asterisk on this one: Zig and Rust recognize the libc sqrt call and lower it to a native instruction, so they're measuring effectively zero per-call overhead rather than a real FFI boundary. Go (via cgo) and Kit both pay a genuine boundary cost on every call, and Kit lands right alongside Go— about 18–20 nanoseconds per foreign call. Reasonable company to keep, with room to improve.

Key Takeaways

  • Kit is still fast, but the field moved. On the new machine and newer toolchains, Kit slipped from first to third on fib(45) as Nim and V surged, though it still edges out Rust, Zig, and Go on recursion.
  • Record unboxing is a big deal. On the new vec3 benchmark, Kit's monomorphized record code beats Zig outright—proof that functional records can run at native struct speed.
  • We know where the work is. The ray tracer (20x behind Zig) and per-call FFI overhead are Kit's clearest optimization targets, and having them in the suite means every future release gets measured against them.
  • 140 releases since tagging began in March. The January benchmark ran on a pre-release compiler with no version tags at all. The pace hasn't slowed, and neither have the benchmarks—we'll keep re-running them as Kit evolves.

Try It Yourself

Want to run these benchmarks on your own hardware? Clone the repository and give it a spin:

jj git clone https://gitlab.com/kit-lang/kit-benchmarks.git
cd kit-benchmarks
./install.sh
./run-benchmarks.sh

We'd love to hear your results, especially on different hardware configurations. Share them with us on @KitLangOrg or @Kit_Lang, or open an issue in the repository.

Updated July 10, 2026: an earlier version of this post said Kit "roughly doubled its fib(45) speed since January" and credited compiler work. As a reader pointed out, every language sped up by a similar or larger factor on the new machine, so the improvement is attributable to the hardware, not the compiler. The wording has been corrected; the tables and rankings are unchanged.