From d9c7471350ef31c168352836befeb2fcae58d1b4 Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Tue, 23 Jun 2026 12:12:56 +0300 Subject: [PATCH] fix(#271): extract Gson instance in ChatViewModel (#324) Extracted the `Gson()` instantiation in `ChatViewModel.kt` to a companion object to avoid creating a new `Gson` instance on every `ToolStart` and `ToolComplete` event handler call. This change reduces garbage collection pressure by caching reflection setup, type adapters, and factories. Impact: - Reduces memory allocations and CPU cycles during multi-step tool chains and streaming. - Safely maintains existing parsing behavior while addressing the `PERF-03` review finding. Closes #271 --- .../java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt index ecd49836..a4f69d36 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt @@ -460,7 +460,7 @@ class ChatViewModel( var orphanToPersist: ChatMessage? = null val sessionId = _uiState.value.currentSessionId - val contentJson = event.data?.let { Gson().toJson(it) } ?: "" + val contentJson = event.data?.let { gson.toJson(it) } ?: "" val toolMessage = ChatMessage( role = MessageRole.TOOL, @@ -509,7 +509,7 @@ class ChatViewModel( it.toolStatus == ToolStatus.RUNNING } if (toolIdx >= 0) { - val contentJson = event.data?.let { Gson().toJson(it) } ?: "" + val contentJson = event.data?.let { gson.toJson(it) } ?: "" val updated = messages[toolIdx].copy( toolStatus = ToolStatus.COMPLETED, @@ -1219,4 +1219,8 @@ class ChatViewModel( pendingCleanupJob?.cancel() wsClient.disconnect() } + + companion object { + private val gson = Gson() + } }