본문으로 건너뛰기

[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);

원본 참조를 그대로 전달합니다.

왜 이게 좋은가

  1. GC 압력 감소: 프레임당 수십~수백 개의 일회용 객체 생성이 사라집니다.
  2. 동작 변경 없음: ResponseMessage는 이미 history.messages에서 직접 읽으므로, 복사본 전달과 원본 전달의 결과가 동일합니다.
  3. 스프레드 연산 비용 제거: 객체 스프레드는 프로퍼티 수에 비례하는 비용이 들지만, 참조 전달은 O(1)입니다.
  4. 단 한 글자 변경: { ...message } -> message라는 최소한의 변경으로 최대 효과를 얻습니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글