[Open WebUI] buildMessages에서 불필요한 객체 스프레드 제거
PR #22086 - perf: skip redundant object spread in buildMessages
들어가며
Open WebUI의 Messages.svelte 컴포넌트에서 buildMessages() 함수는 메시지 연결 리스트를 순회하며 배열을 만듭니다. 이 과정에서 매 메시지마다 { ...message }로 얕은 복사를 생성했는데, ResponseMessage 컴포넌트는 이미 history.messages[messageId]에서 직접 반응형으로 읽기 때문에 이 복사본은 전혀 사용되지 않았습니다.
핵심 코드 분석
Before
_messages.unshift({ ...message });
스트리밍 중 매 애니메이션 프레임마다 실행되므로, 100개 메시지 채팅이면 프레임당 100개의 일회용 객체가 생성됩니다.
After
_messages.unshift(message);
원본 참조를 그대로 전달합니다.
왜 이게 좋은가
- GC 압력 감소: 프레임당 수십~수백 개의 일회용 객체 생성이 사라집니다.
- 동작 변경 없음:
ResponseMessage는 이미history.messages에서 직접 읽으므로, 복사본 전달과 원본 전달의 결과가 동일합니다. - 스프레드 연산 비용 제거: 객체 스프레드는 프로퍼티 수에 비례하는 비용이 들지만, 참조 전달은 O(1)입니다.
- 단 한 글자 변경:
{ ...message }->message라는 최소한의 변경으로 최대 효과를 얻습니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Open WebUI] MultiResponseMessages에 O(1) Fast-path 비교 추가
- 현재글 : [Open WebUI] buildMessages에서 불필요한 객체 스프레드 제거
- 다음글 [Open WebUI] 사용자 메모리 컬렉션 쿼리에 소유권 검증 추가
댓글