From d007db2dcdab2159870cab8708c838edcf0b1cc1 Mon Sep 17 00:00:00 2001 From: Tim <15017472+doodlum@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:04:47 +0100 Subject: [PATCH 1/4] perf(shadercache): use faster clock --- src/ShaderCache.cpp | 22 ++++++++++++++-------- src/ShaderCache.h | 16 ++++++++++++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/ShaderCache.cpp b/src/ShaderCache.cpp index c02199dc86..3e953a2cb1 100644 --- a/src/ShaderCache.cpp +++ b/src/ShaderCache.cpp @@ -2529,7 +2529,8 @@ namespace SIE return std::nullopt; } if (!shaderCache->IsCompiling()) { // we just got woken up because there's a task, start clock - lastCalculation = lastReset = high_resolution_clock::now(); + QueryPerformanceCounter(&lastReset); + lastCalculation = lastReset; } auto node = availableTasks.extract(availableTasks.begin()); auto& task = node.value(); @@ -2564,8 +2565,9 @@ namespace SIE logger::debug("Compiling Task failed: {}", key); failedTasks++; } - auto now = high_resolution_clock::now(); - totalMs += duration_cast(now - lastCalculation).count(); + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + totalTime.QuadPart += now.QuadPart - lastCalculation.QuadPart; lastCalculation = now; std::scoped_lock lock(compilationMutex); processedTasks.insert(task); @@ -2583,14 +2585,14 @@ namespace SIE completedTasks = 0; failedTasks = 0; cacheHitTasks = 0; - lastReset = high_resolution_clock::now(); - lastCalculation = high_resolution_clock::now(); - totalMs = (double)duration_cast(lastReset - lastReset).count(); + QueryPerformanceCounter(&lastReset); + QueryPerformanceCounter(&lastCalculation); + totalTime = { 0 }; } - std::string CompilationSet::GetHumanTime(double a_totalms) + std::string CompilationSet::GetHumanTime(double a_totalMs) { - int milliseconds = (int)a_totalms; + int milliseconds = (int)a_totalMs; int seconds = milliseconds / 1000; int minutes = seconds / 60; seconds %= 60; @@ -2602,6 +2604,8 @@ namespace SIE double CompilationSet::GetEta() { + double totalMs = static_cast(totalTime.QuadPart) * 1000.0 / frequency.QuadPart; + auto rate = completedTasks / totalMs; auto remaining = totalTasks - completedTasks - failedTasks; return std::max(remaining / rate, 0.0); @@ -2609,6 +2613,8 @@ namespace SIE std::string CompilationSet::GetStatsString(bool a_timeOnly) { + double totalMs = static_cast(totalTime.QuadPart) * 1000.0 / frequency.QuadPart; + if (a_timeOnly) return fmt::format("{}/{}", GetHumanTime(totalMs), diff --git a/src/ShaderCache.h b/src/ShaderCache.h index 801bed9b5f..8b9c4a6943 100644 --- a/src/ShaderCache.h +++ b/src/ShaderCache.h @@ -242,11 +242,22 @@ namespace SIE class CompilationSet { public: + LARGE_INTEGER lastReset; + LARGE_INTEGER lastCalculation; + LARGE_INTEGER frequency; + LARGE_INTEGER totalTime = { 0 }; + + CompilationSet() { + QueryPerformanceFrequency(&frequency); + QueryPerformanceCounter(&lastReset); + QueryPerformanceCounter(&lastCalculation); + } + std::optional WaitTake(std::stop_token stoken); void Add(const ShaderCompilationTask& task); void Complete(const ShaderCompilationTask& task); void Clear(); - std::string GetHumanTime(double a_totalms); + std::string GetHumanTime(double a_totalMs); double GetEta(); std::string GetStatsString(bool a_timeOnly = false); std::atomic completedTasks = 0; @@ -260,9 +271,6 @@ namespace SIE std::unordered_set tasksInProgress; std::unordered_set processedTasks; // completed or failed std::condition_variable_any conditionVariable; - std::chrono::steady_clock::time_point lastReset = high_resolution_clock::now(); - std::chrono::steady_clock::time_point lastCalculation = high_resolution_clock::now(); - double totalMs = (double)duration_cast(lastReset - lastReset).count(); }; struct ShaderCacheResult From 97e9798c0cf21493942baf72dba8efb129e15ae9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:15:46 +0000 Subject: [PATCH 2/4] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20pre-commit.?= =?UTF-8?q?ci=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details. --- src/ShaderCache.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ShaderCache.h b/src/ShaderCache.h index 8b9c4a6943..face72e928 100644 --- a/src/ShaderCache.h +++ b/src/ShaderCache.h @@ -247,11 +247,12 @@ namespace SIE LARGE_INTEGER frequency; LARGE_INTEGER totalTime = { 0 }; - CompilationSet() { + CompilationSet() + { QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&lastReset); QueryPerformanceCounter(&lastCalculation); - } + } std::optional WaitTake(std::stop_token stoken); void Add(const ShaderCompilationTask& task); From f62b54c6c85dd75e2eaa90e3630577f6b524fb38 Mon Sep 17 00:00:00 2001 From: Alan Tse Date: Wed, 16 Jul 2025 22:52:50 -0700 Subject: [PATCH 3/4] fix: add div/0 guard Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/ShaderCache.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ShaderCache.cpp b/src/ShaderCache.cpp index 3e953a2cb1..87d371197a 100644 --- a/src/ShaderCache.cpp +++ b/src/ShaderCache.cpp @@ -2606,6 +2606,9 @@ namespace SIE { double totalMs = static_cast(totalTime.QuadPart) * 1000.0 / frequency.QuadPart; + if (totalMs == 0.0) { + return 0.0; // Avoid division by zero + } auto rate = completedTasks / totalMs; auto remaining = totalTasks - completedTasks - failedTasks; return std::max(remaining / rate, 0.0); From 577e687eacf29bfe69e2d6e0ce03162e36bd7d9e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 05:53:33 +0000 Subject: [PATCH 4/4] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20pre-commit.?= =?UTF-8?q?ci=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details. --- src/ShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ShaderCache.cpp b/src/ShaderCache.cpp index 87d371197a..d8e90cea6a 100644 --- a/src/ShaderCache.cpp +++ b/src/ShaderCache.cpp @@ -2607,7 +2607,7 @@ namespace SIE double totalMs = static_cast(totalTime.QuadPart) * 1000.0 / frequency.QuadPart; if (totalMs == 0.0) { - return 0.0; // Avoid division by zero + return 0.0; // Avoid division by zero } auto rate = completedTasks / totalMs; auto remaining = totalTasks - completedTasks - failedTasks;