The jolt-vs-hand-Janet-vs-JVM mandelbrot comparison splits the 15.4x floor into two layers: a Janet-VM floor (~10.8x JVM, optimal while-loop Janet over unboxed doubles — only native codegen moves it) plus a ~1.43x jolt loop- lowering overhead on top. The overhead is entirely the loop/recur -> recursive- closure-called-per-iteration lowering; hand-Janet written the same way matches jolt, while a while+var/set version is 1.43x faster. So a cheap backend win (jolt-v28u) sits above the structural native-codegen lever. Adds the spike artifacts under bench/ and the results writeup; marks the spike done in the handoff. No source changes. Co-authored-by: Yogthos <yogthos@gmail.com>
28 lines
1.3 KiB
Text
28 lines
1.3 KiB
Text
# Dump the Janet that jolt's backend emits for the mandelbrot hot fns, so we can
|
|
# A/B it against bench/mandelbrot-hand.janet and localize the ~1.43x jolt-over-
|
|
# hand-Janet gap measured in the foundational-runtime spike (jolt-5vsp).
|
|
(import ../src/jolt/api :as api)
|
|
(import ../src/jolt/backend :as backend)
|
|
(import ../src/jolt/reader :as reader)
|
|
|
|
(def ctx (api/init-cached {:compile? true}))
|
|
(put (ctx :env) :direct-linking? true)
|
|
(put (ctx :env) :inline? true)
|
|
(api/eval-string ctx "(ns mandelbrot)")
|
|
|
|
(def count-point-src
|
|
"(defn count-point [cr ci cap] (loop [i 0 zr 0.0 zi 0.0] (if (or (>= i cap) (> (+ (* zr zr) (* zi zi)) 4.0)) i (recur (inc i) (+ (- (* zr zr) (* zi zi)) cr) (+ (* 2.0 (* zr zi)) ci)))))")
|
|
|
|
(def run-src
|
|
"(defn run [n] (let [cap 200 nd (* 1.0 n)] (loop [y 0 acc 0] (if (< y n) (let [ci (- (/ (* 2.0 y) nd) 1.0) row (loop [x 0 a 0] (if (< x n) (let [cr (- (/ (* 2.0 x) nd) 1.5)] (recur (inc x) (+ a (count-point cr ci cap)))) a))] (recur (inc y) (+ acc row))) acc))))")
|
|
|
|
(api/eval-string ctx count-point-src)
|
|
(api/eval-string ctx run-src)
|
|
|
|
(defn emit [src]
|
|
(string/format "%p" (backend/emit-ir ctx (backend/analyze-form ctx (reader/parse-string src)))))
|
|
|
|
(print "===== count-point emitted Janet =====")
|
|
(print (emit count-point-src))
|
|
(print "\n===== run emitted Janet =====")
|
|
(print (emit run-src))
|