mirror of
https://github.com/mmueller41/mxtasking.git
synced 2026-01-21 12:42:57 +01:00
Use TSC instead of steady_clock. This saves RPC cost.
This commit is contained in:
@@ -53,7 +53,8 @@ void Profiler::profile(const std::string &profiling_output_file)
|
|||||||
this->_tasks.clear();
|
this->_tasks.clear();
|
||||||
|
|
||||||
this->_profiling_output_file.emplace(profiling_output_file);
|
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<bool> &is_running, Channel &channel)
|
void Profiler::profile(util::maybe_atomic<bool> &is_running, Channel &channel)
|
||||||
@@ -68,9 +69,8 @@ void Profiler::profile(util::maybe_atomic<bool> &is_running, Channel &channel)
|
|||||||
|
|
||||||
void Profiler::stop()
|
void Profiler::stop()
|
||||||
{
|
{
|
||||||
const auto end = std::chrono::steady_clock::now();
|
const auto end = Genode::Trace::timestamp(); // std::chrono::steady_clock::now();
|
||||||
const auto end_relative_nanoseconds =
|
const auto end_relative_nanoseconds = (end - this->_start) / 2000000UL; // std::chrono::duration_cast<std::chrono::nanoseconds>(end - this->_start).count();
|
||||||
std::chrono::duration_cast<std::chrono::nanoseconds>(end - this->_start).count();
|
|
||||||
if (this->_profiling_output_file.has_value())
|
if (this->_profiling_output_file.has_value())
|
||||||
{
|
{
|
||||||
auto output = nlohmann::json{};
|
auto output = nlohmann::json{};
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <base/log.h>
|
||||||
|
|
||||||
namespace mx::tasking::profiling {
|
namespace mx::tasking::profiling {
|
||||||
/**
|
/**
|
||||||
@@ -15,21 +16,22 @@ namespace mx::tasking::profiling {
|
|||||||
class IdleRange
|
class IdleRange
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IdleRange() : _start(std::chrono::steady_clock::now()) {}
|
IdleRange() : _start(Genode::Trace::timestamp()) {}
|
||||||
IdleRange(IdleRange &&) = default;
|
IdleRange(IdleRange &&) = default;
|
||||||
~IdleRange() = default;
|
~IdleRange() = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the end of the idle range to the current time.
|
* 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.
|
* @return Number of nanoseconds idled.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::uint64_t nanoseconds() const noexcept
|
[[nodiscard]] std::uint64_t nanoseconds() const noexcept
|
||||||
{
|
{
|
||||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(_end - _start).count();
|
return (_end - _start) / 2000000UL; // TODO: Get TSC frequency from Genode
|
||||||
|
// return std::chrono::duration_cast<std::chrono::nanoseconds>(_end - _start).count();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,20 +40,26 @@ public:
|
|||||||
* @return Pair of (start, stop) normalized to the given time point.
|
* @return Pair of (start, stop) normalized to the given time point.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::pair<std::uint64_t, std::uint64_t> normalize(
|
[[nodiscard]] std::pair<std::uint64_t, std::uint64_t> 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<std::chrono::nanoseconds>(_start - global_start).count(),
|
std::chrono::duration_cast<std::chrono::nanoseconds>(_start - global_start).count(),
|
||||||
std::chrono::duration_cast<std::chrono::nanoseconds>(_end - global_start).count(),
|
std::chrono::duration_cast<std::chrono::nanoseconds>(_end - global_start).count(),
|
||||||
|
};*/
|
||||||
|
return {
|
||||||
|
(_start - global_start) / 2000000UL,
|
||||||
|
(_end - global_start) / 2000000UL,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Start of idling.
|
// Start of idling.
|
||||||
std::chrono::steady_clock::time_point _start;
|
//std::chrono::steady_clock::time_point _start;
|
||||||
|
Genode::Trace::Timestamp _start;
|
||||||
|
|
||||||
// End of idling.
|
// 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<std::string> _profiling_output_file{std::nullopt};
|
std::optional<std::string> _profiling_output_file{std::nullopt};
|
||||||
|
|
||||||
// Time point of the runtime start.
|
// 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.
|
// List of all idle/profile tasks.
|
||||||
std::vector<ProfilingTask *> _tasks;
|
std::vector<ProfilingTask *> _tasks;
|
||||||
|
|||||||
Reference in New Issue
Block a user