diff options
Diffstat (limited to 'docs/research/044-terminal-viewport-cost.md')
| -rw-r--r-- | docs/research/044-terminal-viewport-cost.md | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/docs/research/044-terminal-viewport-cost.md b/docs/research/044-terminal-viewport-cost.md new file mode 100644 index 0000000..2ee73e0 --- /dev/null +++ b/docs/research/044-terminal-viewport-cost.md @@ -0,0 +1,49 @@ +# 044 — 1 MiB 문서의 화면 갱신 비용과 여러 행 복원 + +고정 정의 터미널 편집기는 1 MiB 문서를 저장했지만, 키를 누를 때마다 커서 위치와 +화면 출력을 계산하면서 문서 처음부터 끝까지 다시 순회했다. 같은 편집기를 실제 +PTY 24×80에서 재생하니 끝에서 한 글자를 입력한 뒤 화면이 완성되기까지 한국어 +1 MiB 문서는 10회 중앙값 37.244 ms가 걸렸다. 여러 행·탭이 들어 있는 정상 +문서를 다시 열지 못하는 문제도 확인했다. 입력 검사가 `wcwidth()`의 줄바꿈·탭 +반환값을 일반 문자와 같이 처리한 것이 원인이었다. + +터미널 호스트 안에 **한 개의 화면 위치 앵커**를 두었다. 바이트 위치·화면 행·열· +터미널 폭을 기억하고, 그 앞을 수정하거나 폭을 바꾸면 무효화한다. 평소 입력과 +화살표 이동은 이 위치부터 보이는 범위만 해석한다. 멀리 이동하면 다시 순회해 +앵커를 만든다. 출력 범위 앞의 연속된 출력 가능 ASCII는 문자마다 `glyph()`을 +호출하지 않고 셀 수를 계산한다. 문서 크기에 비례하는 색인이나 별도 복사본은 +만들지 않았다. 줄바꿈·탭은 텍스트 검사에서 허용하고, 화면 계산은 기존 처리에 +맡긴다. 실행 코어와 `.pure` 계획은 바뀌지 않았다. + +같은 Linux AArch64 장치·CLI·PTY에서 [이전 보관 실행물](../../prototypes/connections/results/2026-09-24-fixed-tui-final/pure-document-cli-tui-linux-aarch64.tar.gz)과 +[현재 실행물](../../prototypes/connections/results/2026-09-24-tui-viewport/pure-document-cli-tui-linux-aarch64.tar.gz)을 +[`measure_tui_latency.py`](../../prototypes/connections/measure_tui_latency.py)로 비교했다. +각 문서를 열고 끝에 `Z`를 10회 순서대로 입력했다. 값은 **입력 전송부터 해당 +화면의 마지막 커서 표시까지**의 중앙값이며 문서 열기·저장·처리량은 포함하지 않는다. +두 실행물의 각 회차 PTY 화면 바이트 SHA-256은 모두 같았다. + +| 실제 문서 입력 | 이전 화면 갱신 중앙값 | 현재 | 비율 | +|---|---:|---:|---:| +| 256 B ASCII | 0.028 ms | 0.030 ms | 유사 | +| 1 MiB ASCII | 15.678 ms | 0.070 ms | 224× | +| 약 1 MiB 한국어 UTF-8 | 37.244 ms | 0.232 ms | 160× | + +[원자료 이전](../../prototypes/connections/results/2026-09-24-tui-viewport/latency-baseline.json), +[원자료 현재](../../prototypes/connections/results/2026-09-24-tui-viewport/latency-current.json). +이 수치는 이 장치·입력 위치·문서 구성에 한정된다. 처음 열기, 앵커보다 앞선 +편집, 화면 폭 변경, 먼 위치로 이동할 때는 전체 순회가 다시 필요할 수 있다. +완전한 문자소 단위 커서 이동·IME·다른 터미널 구현도 검증하지 않았다. + +[실제 PTY 검사](../../prototypes/connections/results/2026-09-24-tui-viewport/pty-flow.json)는 +여러 행·탭 문서의 CLI 생성→TUI 편집→재열기, 60행 위쪽 이동, 1 MiB 한국어 +문서의 앵커 앞 편집과 저장·복원을 확인한다. [ASan·UBSan 검사](../../prototypes/connections/results/2026-09-24-tui-viewport/pty-sanitized.json)도 +같은 흐름을 통과했다. LeakSanitizer는 실행 환경의 ptrace 제약으로 껐다. + +선택형 TUI `text`는 [28,226 B에서 28,762 B](../../prototypes/connections/results/2026-09-24-tui-viewport/profile.json)로 +536 B 증가했고 libc 외 직접 공유 의존성은 없다. 실제 1 MiB ASCII 편집의 +이번 프로세스 피크 RSS는 3,168 KiB였으며 4 MiB 회귀 상한을 통과했다. +이 RSS를 앞선 단일 실행 값보다 줄었다는 근거로 사용하지 않는다. CLI+TUI +[이동 묶음](../../prototypes/connections/results/2026-09-24-tui-viewport/package.json)은 +34,216 B로 선택 구성의 35,840 B 상한 안이다. HTTP까지 선택한 +[전체 묶음](../../prototypes/connections/results/2026-09-24-tui-viewport/package-http-tui.json)은 +51,844 B로 해당 53,248 B 상한을 통과했다. |
