JS ↔ WASM 경계

wasm-bindgen 호출은 쉽지만, 비용은 종종 선형 메모리와 문자열 변환·복사에 있습니다.

개요

이벤트는 JS에서 들어옵니다. WASM으로 넘길 때마다 문자열·버퍼 복사가 붙을 수 있고, 매 input마다 전체 문서를 직렬화하면 내부 diff 알고리즘 전에 병목이 납니다.

복사 비용·인코딩

  • UTF-16 vs UTF-8: JS는 UTF-16 코드 유닛, Rust String은 UTF-8 바이트 인덱스. 경계에서는 스칼라 오프셋·바이트 오프셋을 명시적으로 통일하세요.
  • 큰 문자열: HTML 전체를 매번 Rust로 넘기면 메모리 이중화. 증분 패치·해시된 스냅샷·보안 모델이 허용하는 공유 뷰를 검토합니다.

배치·연산 스트림

가능하면 작은 연산(삽입·삭제·서식)을 넘기고, 협업에서는 바이너리 CRDT 업데이트가 텍스트 스냅샷보다 작을 때가 많습니다.

검증 비용 줄이려고 디바운스할 수는 있지만, 조합·커밋 순서를 뒤섞지 않도록 하세요.

비동기와 입력

WASM에서 시작한 Promise는 마이크로태스크로 이어집니다. Rust 작업이 비동기면 선택·입력 레이스를 막을 가드가 필요합니다.

FFI 위생

  • 문서 상태는 길게 살아가는 핸들(박스 포인터)로 좁은 API 노출.
  • “전체 트리 교체”보다 “연산 적용”을 우선.
  • 성능 패널에서 glue vs WASM 본연 시간을 분리해 측정.