优化了 还是卡

This commit is contained in:
2026-08-25 15:34:31 +08:00
parent fa93927d81
commit 5437b1b267
5 changed files with 58 additions and 13 deletions
+23
View File
@@ -66,6 +66,7 @@ private:
std::atomic<tf::TaskType> active_task_type{tf::TaskType::UNDEFINED};
std::atomic_uint64_t task_time_ns{};
std::atomic_uint64_t busy_time_ns{};
std::atomic_uint64_t cpu_time_ns{};
std::atomic_uint64_t min_task_time_ns{std::numeric_limits<std::uint64_t>::max()};
std::atomic_uint64_t max_task_time_ns{};
};
@@ -82,6 +83,7 @@ private:
};
std::vector<std::vector<Start_Record>> starts;
std::vector<Clock::time_point> worker_busy_starts;
std::vector<std::uint64_t> worker_cpu_starts;
std::unique_ptr<Worker_Statistics[]> worker_statistics;
std::size_t worker_statistics_count{};
std::array<Task_Statistics, tf::TASK_TYPES.size()> task_types;
@@ -99,6 +101,7 @@ private:
std::atomic_size_t max_weak_dependencies{};
std::atomic_uint64_t total_execution_time_ns{};
std::atomic_uint64_t worker_busy_time_ns{};
std::atomic_uint64_t worker_cpu_time_ns{};
std::atomic_uint64_t first_task_time_ns{};
std::atomic_uint64_t last_task_time_ns{};
std::atomic_uint64_t longest_task_time_ns{};
@@ -130,6 +133,7 @@ public:
void set_up(std::size_t workers) override {
starts.resize(workers);
worker_busy_starts.resize(workers);
worker_cpu_starts.resize(workers);
worker_statistics = std::make_unique<Worker_Statistics[]>(workers);
worker_statistics_count = workers;
for (auto& worker : starts) worker.reserve(8);
@@ -139,6 +143,7 @@ public:
auto& worker_starts = starts[worker.id()];
if (worker_starts.empty()) {
worker_busy_starts[worker.id()] = now;
worker_cpu_starts[worker.id()] = current_thread_cpu_ns();
auto active = active_workers.fetch_add(1, std::memory_order_relaxed) + 1;
update_max(peak_active_workers, active);
}
@@ -248,6 +253,11 @@ public:
completed - worker_busy_starts[worker.id()]).count());
worker_busy_time_ns.fetch_add(busy, std::memory_order_relaxed);
worker_state.busy_time_ns.fetch_add(busy, std::memory_order_relaxed);
const auto cpu_started = worker_cpu_starts[worker.id()];
const auto cpu = cpu_completed_ns >= cpu_started
? cpu_completed_ns - cpu_started : 0;
worker_cpu_time_ns.fetch_add(cpu, std::memory_order_relaxed);
worker_state.cpu_time_ns.fetch_add(cpu, std::memory_order_relaxed);
active_workers.fetch_sub(1, std::memory_order_relaxed);
worker_state.active_task_hash.store(0, std::memory_order_relaxed);
worker_state.active_task_started_ns.store(0, std::memory_order_relaxed);
@@ -300,10 +310,16 @@ public:
state.max_weak_dependencies = max_weak_dependencies.load(std::memory_order_relaxed);
state.total_task_time_ns = total_execution_time_ns.load(std::memory_order_relaxed);
state.worker_busy_time_ns = worker_busy_time_ns.load(std::memory_order_relaxed);
state.worker_cpu_time_ns = worker_cpu_time_ns.load(std::memory_order_relaxed);
auto first = first_task_time_ns.load(std::memory_order_relaxed);
auto last = last_task_time_ns.load(std::memory_order_relaxed);
state.observed_wall_time_ns = first && last >= first ? last - first : 0;
state.worker_utilization = workers && state.observed_wall_time_ns ? static_cast<double>(state.worker_busy_time_ns) * 100.0 / static_cast<double>(state.observed_wall_time_ns) / static_cast<double>(workers) : 0.0;
state.worker_cpu_utilization = workers && state.observed_wall_time_ns
? static_cast<double>(state.worker_cpu_time_ns) * 100.0 /
static_cast<double>(state.observed_wall_time_ns) /
static_cast<double>(workers)
: 0.0;
state.task_types.resize(task_types.size());
for (std::size_t i = 0; i < task_types.size(); ++i) {
const auto& source = task_types[i];
@@ -335,11 +351,18 @@ public:
? std::string(tf::to_string(active_type)) : std::string{};
target.task_time_ns = source.task_time_ns.load(std::memory_order_relaxed);
target.busy_time_ns = source.busy_time_ns.load(std::memory_order_relaxed);
target.cpu_time_ns = source.cpu_time_ns.load(std::memory_order_relaxed);
target.non_cpu_time_ns = target.busy_time_ns > target.cpu_time_ns
? target.busy_time_ns - target.cpu_time_ns : 0;
target.idle_time_ns = state.observed_wall_time_ns > target.busy_time_ns ? state.observed_wall_time_ns - target.busy_time_ns : 0;
auto min = source.min_task_time_ns.load(std::memory_order_relaxed);
target.min_task_time_ns = target.task_count ? min : 0;
target.max_task_time_ns = source.max_task_time_ns.load(std::memory_order_relaxed);
target.utilization = state.observed_wall_time_ns ? static_cast<double>(target.busy_time_ns) * 100.0 / static_cast<double>(state.observed_wall_time_ns) : 0.0;
target.cpu_utilization = state.observed_wall_time_ns
? static_cast<double>(target.cpu_time_ns) * 100.0 /
static_cast<double>(state.observed_wall_time_ns)
: 0.0;
}
state.longest_task_time_ns = longest_task_time_ns.load(std::memory_order_relaxed);
state.longest_task_hash = longest_task_hash.load(std::memory_order_relaxed);
+5
View File
@@ -52,10 +52,13 @@ struct Task_Worker_State {
std::string active_task_type{}; /* 当前任务的 Taskflow 原生 TaskType;空闲时为空。 */
std::uint64_t task_time_ns{};
std::uint64_t busy_time_ns{};
std::uint64_t cpu_time_ns{}; /* Worker最外层任务活跃区间内累计的线程 CPU 时间。 */
std::uint64_t non_cpu_time_ns{}; /* busy_time_ns 减去 cpu_time_ns;只表示未计费墙钟,不推断锁或抢占。 */
std::uint64_t idle_time_ns{};
std::uint64_t min_task_time_ns{};
std::uint64_t max_task_time_ns{};
double utilization{};
double cpu_utilization{};
bool operator==(const Task_Worker_State&) const = default;
};
/*
@@ -87,8 +90,10 @@ struct Task_Runtime_State : State_Type<Task_Runtime_State_Tag> {
std::uint64_t longest_task_time_ns{};
std::uint64_t total_task_time_ns{};
std::uint64_t worker_busy_time_ns{};
std::uint64_t worker_cpu_time_ns{};
std::uint64_t observed_wall_time_ns{};
double worker_utilization{};
double worker_cpu_utilization{};
std::vector<Task_Type_State> task_types;
std::vector<Task_Worker_State> workers;
bool operator==(const Task_Runtime_State&) const = default;