Skip to content

Core와 편집 주변 경로의 중복 복사·배치 재탐색을 줄인다 - #738

Merged
developer-1px merged 2 commits into
mainfrom
issue-737-core-adjacent-optimization
Sep 8, 2026
Merged

Core와 편집 주변 경로의 중복 복사·배치 재탐색을 줄인다#738
developer-1px merged 2 commits into
mainfrom
issue-737-core-adjacent-optimization

Conversation

@developer-1px

@developer-1px developer-1px commented Sep 8, 2026

Copy link
Copy Markdown
Owner

요약

기존 core 정리를 최신 main에 통합하고, 같은 렌즈로 찾은 주변 편집 경로의 중복 복사·배치 재탐색을 줄인다. 선행 #732는 이미 병합되었으며 그 readPointer/isJSONValue 정본은 보존한다.

Closes #737

Goal Anchor

  • Outcome: 기존 core 정리와 같은 렌즈로 주변 실행 경로의 불필요한 복사·반복 탐색을 줄이고 production 코드를 순감한다.
  • Done: P1–P9 수정/상류 해결을 검증하고 U1–U11을 최적화 또는 계약상 필요한 처리라는 근거와 회귀 검증으로 모두 판정한다. 동작·소유권·history parity와 대량 비용을 확인하고 공개 capability의 owner API·문서·실행 Usage·source 등록을 연결한다.
  • Don't: JSON 허용 범위, 오류 우선순위, 입력/스냅샷 격리, history/재진입 계약을 약화하지 않는다. 원래 dirty checkout과 다른 PR은 건드리지 않으며, 이 새 PR은 별도 승인 전 병합하지 않는다.

변경

  • Core: 중복 fast replace 실행기, 배열/객체 patch 분기, 반복 overlap 검사와 freeze 경로를 축소. 순차 적용·첫 오류·payload 격리는 유지.
  • Editing: 기존 identity 모듈의 createEditingIdAllocator로 Object/Tree/Order/Document/Calendar 배치 예약을 통일. injected provider, 100회 충돌 제한, Tree parent remap 유지.
  • Session: 이미 소유한 selection의 metadata 사전 복사 제거, inverse prefix 선형 누적, private history push/pop, local history ignore의 불필요한 inverse 생략.
  • Form: pointer 중복/ancestor 쌍 비교 제거 및 snapshot별 defaultValues 재사용. root/escape/move/copy·draft·문서/session/formControl 교체 유지.
  • Collaboration: object key index와 staging lookup, 처음 소유화한 checkpoint base/membership 재사용.
  • Rich Text: stateless apply/read, 내부 payload 사전 clone 제거, 다중 caret shift/group 누적, interval cursor와 batch당 logical order 구축.
  • Editing README/API reference, Clipboard Usage와 source 등록을 함께 갱신.

삭제하지 않은 처리

D10 selection serialization은 anchor/focus/points의 공유 객체를 Core JSON 트리로 변환한다. 제거 시 273개 테스트가 실패해 복원했으며, 이 경계는 필요한 처리로 재분류했다. metadata 중복 복사(D11)만 제거했다.
U2 causal/RFC/authoritative 검증, U4 Date/undefined form 변환, U8 최대 2개 removedPaths 검사, U9 이동 중 구조 rescue/array 위치, U11 normalization 반환값 간 격리도 근거와 회귀 검증에 따라 유지한다. U1–U11의 항목별 판정은 #737 진행 댓글에 있다.

순감

  • Production packages/*/src: −1,389줄 = 기존 Core −1,360 + 주변 −29.
  • 테스트·benchmark·문서·Usage를 포함한 전체 diff: −585줄, 47개 파일.
  • 새 런타임 의존성, Core public symbol, document member는 추가하지 않았다. Editing public allocator 1개는 5개 중복 구현을 대체한다.

성능

병합 직후 main be192b20과 같은 benchmark 파일·자체 lockfile 설치·Node 24.16.0 환경에서 비교한 로컬 중앙값이다. 준비 비용 제외 여부는 각 benchmark의 기존 계약을 따른다.

실제 workload 입력 이전 이후
Object batch paste 기존 50k + 복사 1k 3,465.5ms 464.3ms
Core root object writes 50k 키 중 1k 쓰기 278.4ms 18.6ms
Core equivalent leaf replaces 50k 항목 중 1k no-op 108.8ms 0.94ms
Collaboration wide object ingest 5k 키, leaf 1개 79.4ms 23.2ms
Form unchanged rerender 5k 항목 1.28ms 0.13ms
Form external batch sync 5k 필드 11,034.0ms 10,114.9ms

모든 경로의 일괄 가속을 주장하지 않는다. 특히 Form bulk sync에는 RHF의 필드별 전체 값 복사 비용이 남아 있다. 설치된 RHF에는 bulk API가 있지만 현재 peer ^7.0.0 전체의 지원을 보장할 수 없고 상태·호환 계약 변경은 이번 범위에 추가하지 않았다. 새 후속 이슈는 만들지 않았다.
초기화처럼 개선 대상이 아닌 경로는 변동이 있다. 별도 순서 교대/매 sample GC/20 sample 확인에서 50k 초기화는 26.65→27.19ms(+0.55ms)였다.

검증

  • root build 및 전체 157 files / 1,583 tests 통과, 기존 4 skipped.
  • 변경 Core/Editing/Rich Text/Collaboration/React Hook Form typecheck, site typecheck·canonical/UI guard 통과.
  • Core 패치 무작위 10,000건: applyPatch 결과/오류와 document.commit/value가 main과 일치(성공 5,475, 실패 4,525).
  • Collaboration soak 24 cases × 96 steps 통과.
  • standard:check: 25 Core symbols / 6 members / runtime peer 0 유지.
  • docs:evaluate, docs:api:check(30 packages / 1,050 exports), workspace:check, git diff --check 통과.
  • 실제 tarball smoke: 84 files / 40.5kB packed 통과.
  • site:verify:pages build·정적·HTTP 통과.
  • ID 50k 읽기 1회, 같은 form snapshot 재복사 0, pointer/sibling 재탐색 0, metadata/입력 격리, 긴 inverse/history, nested topology, collision/원자성, Usage 실행 회귀 추가.
  • 기존 Chrome profile에서 실제 조작 검증 통과: Clipboard 복사 후 2회 붙여넣기(3→5 blocks, ID 5개 모두 고유), Form draft 격리→저장→Undo→Redo(각 revision 1→2→3)와 form 값 동기화 확인. 두 흐름의 브라우저 error/unhandledrejection 0. 새 profile 생성이나 브라우저 재시작 없이 검증했다.
  • GitHub CI: head 9be88b4f의 Plan, Package, Site, External kit 모두 통과.

커밋

  • 17f9ca76 Core 정리 이관
  • 9be88b4f 주변 경로 경량화 및 검증

원래 작업 폴더의 모든 미커밋 변경은 그대로 보존했다.

@developer-1px
developer-1px merged commit a36ab5e into main Sep 8, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Core와 주변 편집 경로의 중복 복사·반복 탐색을 줄인다

1 participant