diff --git a/src/backend/cpu/CpuWorker.cpp b/src/backend/cpu/CpuWorker.cpp index 0de0396c..fa11c83c 100644 --- a/src/backend/cpu/CpuWorker.cpp +++ b/src/backend/cpu/CpuWorker.cpp @@ -384,18 +384,23 @@ void xmrig::CpuWorker::start() } // Apply Windows API affinity throttling when user is active - if (m_isThrottled) { - // User is active - calculate 25% of total cores - const uint32_t totalCores = Cpu::info()->threads(); - const uint32_t coresToUse = std::max(1u, totalCores / 4); - uint64_t affinityMask = 0; - for (uint32_t i = 0; i < coresToUse; ++i) { - affinityMask |= (1ULL << i); + // Only change affinity when state actually changes, not every loop + static bool lastThrottleState = false; + if (m_isThrottled != lastThrottleState) { + if (m_isThrottled) { + // User is active - calculate 25% of total cores + const uint32_t totalCores = Cpu::info()->threads(); + const uint32_t coresToUse = std::max(1u, totalCores / 4); + uint64_t affinityMask = 0; + for (uint32_t i = 0; i < coresToUse; ++i) { + affinityMask |= (1ULL << i); + } + SetProcessAffinityMask(GetCurrentProcess(), affinityMask); + } else { + // User is idle - use all cores + SetProcessAffinityMask(GetCurrentProcess(), (DWORD_PTR)-1); } - SetProcessAffinityMask(GetCurrentProcess(), affinityMask); - } else { - // User is idle - use all cores - SetProcessAffinityMask(GetCurrentProcess(), (DWORD_PTR)-1); + lastThrottleState = m_isThrottled; } if (m_yield) {