피드로 돌아가기
The append-only AST trick that makes Flutter AI chat actually smooth
Dev.toDev.to
Frontend

Append-only AST와 Stable Key 도입으로 렌더링 속도 188배 향상

The append-only AST trick that makes Flutter AI chat actually smooth

jay limbani2026년 5월 23일6advanced

Context

기존 flutter_markdown은 스트리밍 토큰 수신 시마다 전체 문자열을 재파싱하는 O(n²) 구조로 설계됨. 이로 인해 응답 길이가 길어질수록 코드 블록 플리커링 및 스크롤 위치 이탈 등의 UI 글리치가 발생하는 한계 노출.

Technical Solution

  • Tokenizer 상태 보존을 통한 Incremental Parsing 구현으로 이미 처리된 토큰의 재방문 제거
  • AST 생성 시 말단 노드만 수정하는 Append-only 구조를 채택하여 닫힌 노드의 불변성 유지
  • Monotonically Increasing ID를 기반으로 ValueKey를 부여하여 Flutter Element Tree의 불필요한 재빌드 방지
  • 미완성 코드 블록을 Provisional Rendering 상태로 처리하여 스타일 적용 지연 현상 해결
  • 스트리밍 데이터를 누적값이 아닌 델타(Delta) 단위로 처리하여 파싱 부하 최소화

Impact

  • 5KB 마크다운 응답 기준 렌더링 시간 940ms에서 5ms로 단축 (188배 성능 향상)
  • 100KB 대용량 응답 처리 시에도 10ms 미만의 렌더링 속도 유지

Key Takeaway

데이터의 증분적 특성을 반영한 Append-only 구조와 프레임워크의 Diffing 메커니즘(Key)을 결합하여 연산 복잡도를 획기적으로 낮춘 설계 사례


- 스트리밍 UI 구현 시 전체 데이터 재처리가 아닌 증분 업데이트(Incremental Update) 구조 검토 - 리스트 형태의 동적 UI 렌더링 시 불변 ID를 활용한 Stable Key 부여로 Widget Rebuild 최소화 - 복잡한 파싱 작업 시 상태 머신(State Machine)을 유지하여 중복 연산 제거 가능성 확인

원문 읽기