fast path for active agent state changes

- 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
This commit is contained in:
Levi Neely 2026-08-03 20:27:45 +02:00
parent 8792539bcc
commit 2d373b4bfb
1 changed files with 25 additions and 10 deletions

View File

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