diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 2656c9acb8..552c9b5b14 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -2750,9 +2750,7 @@ bool spu_thread::process_mfc_cmd() std::this_thread::yield(); // Reset perf - perf_meter<'x'> dummy; - perf0 = dummy; - dummy.reset(); + perf0.restart(); } alignas(64) spu_rdata_t temp; diff --git a/rpcs3/Emu/perf_meter.hpp b/rpcs3/Emu/perf_meter.hpp index 6a09912e7e..93101f0a99 100644 --- a/rpcs3/Emu/perf_meter.hpp +++ b/rpcs3/Emu/perf_meter.hpp @@ -83,18 +83,17 @@ template class perf_meter { // Initialize array (possibly only 1 element) with timestamp - u64 m_timestamps[1 + sizeof...(SubEvents)] = {__rdtsc()}; + u64 m_timestamps[1 + sizeof...(SubEvents)]; public: - SAFE_BUFFERS perf_meter() noexcept + SAFE_BUFFERS FORCE_INLINE perf_meter() noexcept { - m_timestamps[0] = __rdtsc(); - std::memset(m_timestamps + 1, 0, sizeof(m_timestamps) - sizeof(u64)); + restart(); } // Copy first timestamp template - SAFE_BUFFERS perf_meter(const perf_meter& r) noexcept + SAFE_BUFFERS FORCE_INLINE perf_meter(const perf_meter& r) noexcept { m_timestamps[0] = r.get(); std::memset(m_timestamps + 1, 0, sizeof(m_timestamps) - sizeof(u64)); @@ -147,11 +146,18 @@ public: } // Disable this counter - SAFE_BUFFERS void reset() noexcept + SAFE_BUFFERS FORCE_INLINE void reset() noexcept { m_timestamps[0] = 0; } + // Re-initialize first timestamp + SAFE_BUFFERS FORCE_INLINE void restart() noexcept + { + m_timestamps[0] = __rdtsc(); + std::memset(m_timestamps + 1, 0, sizeof(m_timestamps) - sizeof(u64)); + } + SAFE_BUFFERS ~perf_meter() { // Disabled counter