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