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:
parent
8792539bcc
commit
2d373b4bfb
|
|
@ -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();
|
||||
|
|
|
|||
Reference in New Issue