diff options
author | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-12-02 22:12:23 +0100 |
---|---|---|
committer | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-12-04 01:55:59 +0100 |
commit | f919498f8f4e36477d8ea3424f9ecbfae7576340 (patch) | |
tree | 62352f05a6bd485ee4d67703433294fa86309b9d /src/common/x64 | |
parent | Merge pull request #7489 from Morph1984/steady-clock (diff) | |
download | yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.tar yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.tar.gz yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.tar.bz2 yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.tar.lz yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.tar.xz yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.tar.zst yuzu-f919498f8f4e36477d8ea3424f9ecbfae7576340.zip |
Diffstat (limited to 'src/common/x64')
-rw-r--r-- | src/common/x64/native_clock.cpp | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/src/common/x64/native_clock.cpp b/src/common/x64/native_clock.cpp index 28f834443..82ee2c8a1 100644 --- a/src/common/x64/native_clock.cpp +++ b/src/common/x64/native_clock.cpp @@ -15,26 +15,26 @@ namespace Common { u64 EstimateRDTSCFrequency() { - const auto milli_10 = std::chrono::milliseconds{10}; - // get current time + // Discard the first result measuring the rdtsc. _mm_mfence(); - const u64 tscStart = __rdtsc(); - const auto startTime = std::chrono::steady_clock::now(); - // wait roughly 3 seconds - while (true) { - auto milli = std::chrono::duration_cast<std::chrono::milliseconds>( - std::chrono::steady_clock::now() - startTime); - if (milli.count() >= 3000) - break; - std::this_thread::sleep_for(milli_10); - } - const auto endTime = std::chrono::steady_clock::now(); + __rdtsc(); + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + _mm_mfence(); + __rdtsc(); + + // Get the current time. + const auto start_time = std::chrono::steady_clock::now(); + _mm_mfence(); + const u64 tsc_start = __rdtsc(); + // Wait for 200 milliseconds. + std::this_thread::sleep_for(std::chrono::milliseconds{200}); + const auto end_time = std::chrono::steady_clock::now(); _mm_mfence(); - const u64 tscEnd = __rdtsc(); - // calculate difference - const u64 timer_diff = - std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - startTime).count(); - const u64 tsc_diff = tscEnd - tscStart; + const u64 tsc_end = __rdtsc(); + // Calculate differences. + const u64 timer_diff = static_cast<u64>( + std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time).count()); + const u64 tsc_diff = tsc_end - tsc_start; const u64 tsc_freq = MultiplyAndDivide64(tsc_diff, 1000000000ULL, timer_diff); return tsc_freq; } |