CekState record optimization + profiling: 1.5x speedup, root cause found

Transpiler (transpiler.sx): detects CEK state dict literals (5 fields:
control/env/kont/phase/value) and emits CekState OCaml record instead
of Dict(Hashtbl). Eliminates 200K Hashtbl allocations per page.

Bootstrapper: skip stdlib.sx (functions already registered as OCaml
primitives). Only transpile evaluator.sx.

Runtime: get_val handles CekState with direct field access. type_of
returns "dict" for CekState (backward compat).

Profiling results (root cause of slowness):
  Pure eval: OCaml 1.6x FASTER than Python (expected)
  Aser: OCaml 28x SLOWER than Python (unexpected!)

Root cause: Python has a native optimized aser. OCaml runs the SX
adapter-sx.sx through the CEK machine — each aserCall is ~50 CEK
steps with closures, scope operations, string building.

Fix needed: native OCaml aser (like Python's), not SX adapter
through CEK machine.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-19 17:40:34 +00:00
parent 8707f21ca2
commit c16142d14c
6 changed files with 64 additions and 16 deletions

View File

@@ -412,12 +412,29 @@
(define ml-emit-dict-native
(fn ((d :as dict) (set-vars :as list))
(let ((items (keys d)))
(str "(let _d = Hashtbl.create " (str (round (len items)))
" in " (join "; " (map (fn (k)
(str "Hashtbl.replace _d " (ml-quote-string k)
" " (ml-expr-inner (get d k) set-vars)))
items))
"; Dict _d)"))))
;; Optimize CEK state dicts — emit CekState record instead of Hashtbl.
;; Detected by having exactly {control, env, kont, phase, value} keys.
(if (and (= (len items) 5)
(some (fn (k) (= k "control")) items)
(some (fn (k) (= k "phase")) items)
(some (fn (k) (= k "kont")) items))
(str "(CekState { cs_control = " (ml-expr-inner (get d "control") set-vars)
"; cs_env = " (ml-expr-inner (get d "env") set-vars)
"; cs_kont = " (ml-expr-inner (get d "kont") set-vars)
"; cs_phase = " (let ((p (get d "phase")))
(if (= (type-of p) "string")
(ml-quote-string p)
(str "(match " (ml-expr-inner p set-vars)
" with String s -> s | _ -> \"\")")))
"; cs_value = " (ml-expr-inner (get d "value") set-vars)
" })")
;; Regular dict — Hashtbl
(str "(let _d = Hashtbl.create " (str (round (len items)))
" in " (join "; " (map (fn (k)
(str "Hashtbl.replace _d " (ml-quote-string k)
" " (ml-expr-inner (get d k) set-vars)))
items))
"; Dict _d)")))))
;; --------------------------------------------------------------------------