Single-pass aser_slot for HTMX path + kernel eval timing + stable hash
Eliminated double-aser for HTMX requests: build OOB wrapper AST (~shared:layout/oob-sx :content wrapped_ast) and aser_slot in ONE pass — same pattern as the full-page path. Halves aser_slot calls. Added kernel-side timing to stderr: [aser-slot] eval=3.6s io_flush=0.0s batched=3 result=22235 chars Results show batch IO works (io_flush=0.0s for 3 highlight calls) and the bottleneck is pure CEK evaluation time, not IO. Performance after single-pass fix: Home: 0.7s eval (was 2.2s total) Reactive: 3.6s eval (was 6.8s total) Language: 1.1s eval (was 18.9s total — double-aser eliminated) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -59,11 +59,12 @@ class OcamlBridge:
|
||||
)
|
||||
|
||||
_logger.info("Starting OCaml SX kernel: %s", bin_path)
|
||||
import sys
|
||||
self._proc = await asyncio.create_subprocess_exec(
|
||||
bin_path,
|
||||
stdin=asyncio.subprocess.PIPE,
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.PIPE,
|
||||
stderr=sys.stderr, # kernel timing/debug to container logs
|
||||
limit=10 * 1024 * 1024, # 10MB readline buffer for large spec data
|
||||
)
|
||||
|
||||
@@ -312,12 +313,9 @@ class OcamlBridge:
|
||||
assert self._proc and self._proc.stdout
|
||||
data = await self._proc.stdout.readline()
|
||||
if not data:
|
||||
# Process died — collect stderr for diagnostics
|
||||
stderr = b""
|
||||
if self._proc.stderr:
|
||||
stderr = await self._proc.stderr.read()
|
||||
# Process died
|
||||
raise OcamlBridgeError(
|
||||
f"OCaml subprocess died unexpectedly. stderr: {stderr.decode(errors='replace')}"
|
||||
"OCaml subprocess died unexpectedly (check container stderr)"
|
||||
)
|
||||
line = data.decode().rstrip("\n")
|
||||
_logger.debug("RECV: %s", line[:120])
|
||||
|
||||
Reference in New Issue
Block a user