CrownyJIT 9차 — startup 고정비 분해 및 hot임계 warmup 절감
개요
2026-07-07 9차 세션. 8차 인수인계의 "startup 고정비 ~0.05s가 짧은루프 벽시계 지배" 가설을
실측으로 검증 → 반증했다. 실제 프로세스 startup은 ~4ms이고 mem_init calloc은 0.02ms로
무시가능. 짧은 JIT-on 루프의 진짜 지배항은
hot임계(10000) 前 인터프리터 warmup(~12ms)이었다.
이를 crownyc_jit_hot.c 한정으로 완화(기본 임계 10000→2000)해 canon 3M 27→22ms, 짧은루프 ~40%↓.
14커널 IDENTICAL 회귀0, 차등검증 게이트(CAP=4096) 무손상. 공유 crownyc.c/crownyc
무접촉.
1. 원인 분해 (실측 먼저 — 가설 반증)
측정법: python perf_counter best-of-11~21 (min), 교차검증 /usr/bin/time -p. Apple Silicon.
startup 스테이지 분해 (empty 프로그램, 224B toau)
| 스테이지 | 실측 | 비고 |
|---|
| trivial 프로세스 spawn (bare dyld+exec) | ~2.1 ms | int main(){} 기준선 |
| Security+CoreFoundation 프레임워크 dyld | +1.9 ms | fw probe 4.06 − trivial 2.12 |
| mem_init: 2× calloc(144M×27B=7.7GB) | 0.02 ms | lazy mmap, 지연커밋 — 비지배 |
| toau read/parse(224B) + str_init + VM setup | ~0.2 ms | empty 4.22 − fw 4.06 |
| empty startup 합계 | ~4.2 ms | JIT off·on 동일(3.7~4.2) |
핵심 반증: 8차 인수인계의 "~0.05s startup"은 재현 안 됨. 실측 startup=~4ms.
0.05s는 당시 shell
time(0.01s 해상도) + 머신부하 라운딩 잡음이었다.
crownyc-jit run empty(JIT off)=3.68ms ≈ 공유
crownyc run empty=3.87ms →
startup은 JIT 문제가 아니라 VM 공통이며, 그중 ~95%가 spawn+프레임워크 dyld(불가피 per-exec).
mem_init 144M calloc은 지연커밋이라 0.02ms(비지배) — 8차가 지목한 후보 아님.
짧은 JIT-on 루프의 진짜 지배항 (재정의)
jit_hot_threshold=10000: 루프는 hot이 되기 전
10000회를 인터프리터로 warmup(~1.2µs/회 ≈ 12ms).
그 뒤 JIT 발화, 나머지는 native(canon 나머지 3M을 0.22ms). 즉 짧은루프 벽시계 구성:
| 성분 | canon3M JIT-on(28ms) | 성격 |
|---|
| 프로세스 startup | ~4 ms | VM공통·불가피(dyld+프레임워크) |
| hot임계 前 warmup(10000회 interp) | ~12 ms | JIT 튜닝가능 — 이번 타깃 |
| 차등검증 게이트(CAP=4096 interp+native 각1회) | ~3–5 ms | 안전핵심 — 유지필수 |
| JIT'd native region(잔여 iter) | ~5 ns/iter | 8차 완료분 |
2. 증분 절감 — hot임계 warmup 축소 (crownyc_jit_hot.c 한정)
jit_hot_threshold 기본 10000→2000(9차). warmup을 ~12ms→~2.4ms로 축소.
차등검증(CAP=4096)은 그대로 → 트랜스파일 버그는 여전히 출력 무오염(MISMATCH=BAIL).
전/후 벤치 (best-of-15 min, JIT-on asm, total wall)
| 커널 | HOT=10000(구) | HOT=2000(신기본) | HOT=100(공격적) | 신기본 절감 |
|---|
| canon 3M | 27.4 ms | 22.5 ms | 21.2 ms | −18% |
| finance 3M | 51.8 ms | 45.0 ms | 44.5 ms | −13% |
| fp지역 10M | 48.3 ms | 41.4 ms | 39.7 ms | −14% |
| deep 2M | 40.1 ms | 30.4 ms | 28.3 ms | −24% |
| loop 30k | 12.7 ms | 8.0 ms | 6.6 ms | −37% |
- 더 공격적 튜닝은 env로:
CROWNY_JIT_HOT=100 — 장기iter·짧은wall 워크로드에 canon 21ms.
- 임계 100~50 이하는 floor(startup+검증)에 수렴, 더 안 줄어듦.
- tiny 루프(200~4096회) 회귀 없음: HOT 10000 vs 2000 vs 100 차이 ±0.3ms(잡음). 5000회↑부터 순이득.
(검증이 자연exit까지만 돌아 interp를 native로 치환 → 6000회 루프도 HOT=100이 더 빠름.)
회귀 (base==JITon==shared, md5 IDENTICAL)
14커널 전부
IDENTICAL (신기본 2000 재빌드 후):
canon·finance·fp지역·deep·depth10·arb·배열합·배열쓰기·3D렌더러·작업구분·브레인결재·유체시뮬·ARIMA·stab.
공유 crownyc가 세션 중
타 세션에 의해 05:37 재빌드됐으나(내가 아님) shared==jitoff==jiton 재검증 통과.
3. 남은 고정비 (신기본 적용 후 floor)
- 프로세스 startup ~4ms: ~1.9ms가 Security/CoreFoundation dyld(공유 VM의 TLS/SHA256 심볼 필요),
~2.1ms가 bare spawn.
JIT로 못 줄임 — 공유 VM 영역(정적링크/프레임워크 지연바인딩=안건 티켓).
- 차등검증 ~3–5ms: 안전핵심. 축소 금지(과제 지시 "게이트 유지").
- 결론: 신기본 적용 후 짧은루프 floor ≈ startup4 + 검증3~5 ≈ 7~9ms. 이 이하는 상주형만이 돌파.
4. 대안 — 상주형 실행 타당성 (3줄)
- 타당성 高: crownyc에 TCP/소켓 빌트인 존재, 크라우니LLM서버(:9976)·크라우니뇌(:9977) 상주 선례 있음.
toau 경로/바이트를 stdin·소켓으로 받아 warm dyld+armed JIT+self-test완료 상태로 상주 → per-call startup ~4ms + self-test 상시 제거.
- 예상 이득: 고빈도 짧은루프 호출에서 최대(loop30k 8→~4ms, −50%), canon 22→~18ms(−18%). 원샷 CLI엔 4ms가 이미 무시가능이라 무의미.
- 과제(이번 미구현): 요청간 memory[](touched만 memset, lazy라 저렴)·cj_state 등 JIT 루프테이블 리셋 필요. 검증게이트는 프로그램별 재발화라 유지.
관련 파일 (전부 /Users/ef/CrownyOS/crownyc/)
crownyc_jit_hot.c — ★L29 jit_hot_threshold 10000→2000(주석에 9차 근거 실측 기록). 유일 변경.
crownyc-jit — 재빌드: cc -O2 -o crownyc-jit crownyc_jitmain.c crownyc_jit_snippets.s -framework Security -framework CoreFoundation
crownyc.c/crownyc — 공유, 무접촉(내 세션 중 타 세션이 05:34/05:37 갱신 — 나와 무관, shared==jit 재검증 통과).
- 벤치/회귀 toau:
/tmp/JIT실적용/{canon,finance,fp지역,deep,depth10,arb,배열합,배열쓰기,3D렌더러,작업구분,브레인결재,유체시뮬,ARIMA,stab}.toau.
- probe:
/tmp/{trivial,fw,calloc_probe}.c — startup 스테이지 분해용(임시).
남은 작업 (다음 세션)
- 상주형 실행 모드(§4): 고빈도 배치/RPC용. per-call 4ms + self-test 제거. 상태리셋 설계 필요.
- startup 프레임워크 dyld ~1.9ms: Security/CoreFoundation 지연바인딩 or 정적링크 = 공유 VM 안건 티켓(JIT 무관).
- 차등게이트 CAP 커버리지(8차 이월): 후반부 정수오버플로 발산 미검출 가능 — CAP를 잔여비례 확대 검토.
- TSHR/TSHL(op94/95) 레지스터모드 스니펫(8차 이월). asm 배열 저ROI.
- crownyc_jit_hot.한선 동반본: 이번은 튜닝상수(신규로직 아님) — 다음 로직 변경 시 동반 갱신.
안전수칙 준수
- 공유 crownyc.c/crownyc 무수정·무재빌드(내 손). 산출물 crownyc-jit 별도. 데몬·커밋·영속인프라 없음.
- 변경=크라우니jit 전용 파일 1줄(기본 임계). 차등검증 게이트 무손상 → 코드젠 확대돼도 출력 무오염.
- 14커널 IDENTICAL + tiny루프 무회귀 실측으로 기본값 변경 정당화. CROWNY_JIT_HOT로 원복/재튜닝 가능.