← 목록
기타 2026-07-07 7KB 읽기 8분

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 msint main(){} 기준선
Security+CoreFoundation 프레임워크 dyld+1.9 msfw probe 4.06 − trivial 2.12
mem_init: 2× calloc(144M×27B=7.7GB)0.02 mslazy mmap, 지연커밋 — 비지배
toau read/parse(224B) + str_init + VM setup~0.2 msempty 4.22 − fw 4.06
empty startup 합계~4.2 msJIT 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 msVM공통·불가피(dyld+프레임워크)
hot임계 前 warmup(10000회 interp)~12 msJIT 튜닝가능 — 이번 타깃
차등검증 게이트(CAP=4096 interp+native 각1회)~3–5 ms안전핵심 — 유지필수
JIT'd native region(잔여 iter)~5 ns/iter8차 완료분

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 3M27.4 ms22.5 ms21.2 ms−18%
finance 3M51.8 ms45.0 ms44.5 ms−13%
fp지역 10M48.3 ms41.4 ms39.7 ms−14%
deep 2M40.1 ms30.4 ms28.3 ms−24%
loop 30k12.7 ms8.0 ms6.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 스테이지 분해용(임시).

남은 작업 (다음 세션)

  1. 상주형 실행 모드(§4): 고빈도 배치/RPC용. per-call 4ms + self-test 제거. 상태리셋 설계 필요.
  2. startup 프레임워크 dyld ~1.9ms: Security/CoreFoundation 지연바인딩 or 정적링크 = 공유 VM 안건 티켓(JIT 무관).
  3. 차등게이트 CAP 커버리지(8차 이월): 후반부 정수오버플로 발산 미검출 가능 — CAP를 잔여비례 확대 검토.
  4. TSHR/TSHL(op94/95) 레지스터모드 스니펫(8차 이월). asm 배열 저ROI.
  5. crownyc_jit_hot.한선 동반본: 이번은 튜닝상수(신규로직 아님) — 다음 로직 변경 시 동반 갱신.

안전수칙 준수

  • 공유 crownyc.c/crownyc 무수정·무재빌드(내 손). 산출물 crownyc-jit 별도. 데몬·커밋·영속인프라 없음.
  • 변경=크라우니jit 전용 파일 1줄(기본 임계). 차등검증 게이트 무손상 → 코드젠 확대돼도 출력 무오염.
  • 14커널 IDENTICAL + tiny루프 무회귀 실측으로 기본값 변경 정당화. CROWNY_JIT_HOT로 원복/재튜닝 가능.