Skip to content

Commit 00a7481

Browse files
Algorithm5838github-actions[bot]
authored andcommitted
perf: skip deep clone per streaming token in ResponseMessage
1 parent 0be9f42 commit 00a7481

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

src/lib/components/chat/Messages/ResponseMessage.svelte

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,15 @@
123123
$: if (history.messages) {
124124
const source = history.messages[messageId];
125125
if (source) {
126-
// Fast path: O(1) check on the fields that change most often (content during streaming, done at end)
127-
// Avoids 2x O(n) JSON.stringify calls that are always true during streaming anyway
126+
// Fast path: O(1) check on the fields that change most often (content during streaming, done at end).
127+
// Mid-stream: spread previous snapshot, O(key count) instead of a full deep clone per token.
128+
// At completion (done flips true): full clone once to capture usage, selectedModelId, etc.
128129
if (message.content !== source.content || message.done !== source.done) {
129-
message = structuredClone(source);
130+
if (!message.done && source.done) {
131+
message = structuredClone(source);
132+
} else {
133+
message = { ...message, content: source.content, done: source.done };
134+
}
130135
} else if (JSON.stringify(message) !== JSON.stringify(source)) {
131136
// Slow path: full comparison for infrequent changes (sources, annotations, status, etc.)
132137
message = structuredClone(source);

0 commit comments

Comments
 (0)