From 2d373b4bfb459a0a34d2a824ebab8212b6de89c0 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Mon, 3 Aug 2026 20:27:45 +0200 Subject: [PATCH] fast path for active agent state changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Check if event is for active agent FIRST using QStringView comparison - Active agent: compare payload directly against m_activeState (no hash lookup) - Non-active: use iterator find() to avoid double hash lookup For the most common case (active agent state change), this reduces the hot path to: QStringView compare → QString convert → direct compare --- gui/ollie9pclient.cpp | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/gui/ollie9pclient.cpp b/gui/ollie9pclient.cpp index 7665f3a..f2f2100 100644 --- a/gui/ollie9pclient.cpp +++ b/gui/ollie9pclient.cpp @@ -298,20 +298,35 @@ void Ollie9pClient::handleEvent(const QString &eventLine) // Hot path: agent state change if (payload.isEmpty()) return; - const QString sidStr = sessionId.toString(); - const QString aidStr = agentId.toString(); - const QString key = agentKey(sidStr, aidStr); - const QString payloadStr = payload.toString(); + // Fast path: check if this is the active agent first (avoids toString for non-active) + const bool isActiveAgent = (sessionId == m_activeSessionId && agentId == m_agentId); - if (m_agentStateValues.value(key) != payloadStr) { + if (isActiveAgent) { + // Super fast path: compare payload directly against current active state + const QString payloadStr = payload.toString(); + if (m_activeState == payloadStr) return; // No change + + // State changed for active agent + m_activeState = payloadStr; + const QString sidStr = sessionId.toString(); + const QString aidStr = agentId.toString(); + const QString key = agentKey(sidStr, aidStr); m_agentStateValues[key] = payloadStr; emit agentStateChanged(sidStr, aidStr, payloadStr); + emit activeStateChanged(); + } else { + // Non-active agent: need to check cache + const QString sidStr = sessionId.toString(); + const QString aidStr = agentId.toString(); + const QString key = agentKey(sidStr, aidStr); + const QString payloadStr = payload.toString(); - // Fast check: is this the active agent? - if (sidStr == m_activeSessionId && aidStr == m_agentId) { - m_activeState = payloadStr; - emit activeStateChanged(); - } + // Use iterator to avoid double lookup + auto it = m_agentStateValues.find(key); + if (it != m_agentStateValues.end() && it.value() == payloadStr) return; + + m_agentStateValues[key] = payloadStr; + emit agentStateChanged(sidStr, aidStr, payloadStr); } } else if (agentAction == QLatin1String("new") || agentAction == QLatin1String("kill")) { refreshSessions();