From 54974c48bee564927eec9a3ba185339047e20144 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Mon, 27 Mar 2023 16:28:14 +0200 Subject: [PATCH] Use TSC instead of steady_clock. This saves RPC cost. --- src/mx/tasking/profiling/profiling_task.cpp | 8 +++---- src/mx/tasking/profiling/profiling_task.h | 25 ++++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/mx/tasking/profiling/profiling_task.cpp b/src/mx/tasking/profiling/profiling_task.cpp index c612f05..b2b10fb 100644 --- a/src/mx/tasking/profiling/profiling_task.cpp +++ b/src/mx/tasking/profiling/profiling_task.cpp @@ -53,7 +53,8 @@ void Profiler::profile(const std::string &profiling_output_file) this->_tasks.clear(); this->_profiling_output_file.emplace(profiling_output_file); - this->_start = std::chrono::steady_clock::now(); + this->_start = Genode::Trace::timestamp(); + //::chrono::steady_clock::now(); } void Profiler::profile(util::maybe_atomic &is_running, Channel &channel) @@ -68,9 +69,8 @@ void Profiler::profile(util::maybe_atomic &is_running, Channel &channel) void Profiler::stop() { - const auto end = std::chrono::steady_clock::now(); - const auto end_relative_nanoseconds = - std::chrono::duration_cast(end - this->_start).count(); + const auto end = Genode::Trace::timestamp(); // std::chrono::steady_clock::now(); + const auto end_relative_nanoseconds = (end - this->_start) / 2000000UL; // std::chrono::duration_cast(end - this->_start).count(); if (this->_profiling_output_file.has_value()) { auto output = nlohmann::json{}; diff --git a/src/mx/tasking/profiling/profiling_task.h b/src/mx/tasking/profiling/profiling_task.h index 1b3f0fc..52cad4d 100644 --- a/src/mx/tasking/profiling/profiling_task.h +++ b/src/mx/tasking/profiling/profiling_task.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace mx::tasking::profiling { /** @@ -15,21 +16,22 @@ namespace mx::tasking::profiling { class IdleRange { public: - IdleRange() : _start(std::chrono::steady_clock::now()) {} + IdleRange() : _start(Genode::Trace::timestamp()) {} IdleRange(IdleRange &&) = default; ~IdleRange() = default; /** * Sets the end of the idle range to the current time. */ - void stop() noexcept { _end = std::chrono::steady_clock::now(); } + void stop() noexcept { _end = Genode::Trace::timestamp(); } /** * @return Number of nanoseconds idled. */ [[nodiscard]] std::uint64_t nanoseconds() const noexcept { - return std::chrono::duration_cast(_end - _start).count(); + return (_end - _start) / 2000000UL; // TODO: Get TSC frequency from Genode + // return std::chrono::duration_cast(_end - _start).count(); } /** @@ -38,20 +40,26 @@ public: * @return Pair of (start, stop) normalized to the given time point. */ [[nodiscard]] std::pair normalize( - const std::chrono::steady_clock::time_point global_start) const noexcept + const Genode::Trace::Timestamp global_start) const noexcept { - return { + /*return { std::chrono::duration_cast(_start - global_start).count(), std::chrono::duration_cast(_end - global_start).count(), + };*/ + return { + (_start - global_start) / 2000000UL, + (_end - global_start) / 2000000UL, }; } private: // Start of idling. - std::chrono::steady_clock::time_point _start; + //std::chrono::steady_clock::time_point _start; + Genode::Trace::Timestamp _start; // End of idling. - std::chrono::steady_clock::time_point _end; + //std::chrono::steady_clock::time_point _end; + Genode::Trace::Timestamp _end; }; /** @@ -110,7 +118,8 @@ private: std::optional _profiling_output_file{std::nullopt}; // Time point of the runtime start. - std::chrono::steady_clock::time_point _start; + //std::chrono::steady_clock::time_point _start; + Genode::Trace::Timestamp _start; // List of all idle/profile tasks. std::vector _tasks;