diff --git a/esphome/core/runtime_stats.cpp b/esphome/core/runtime_stats.cpp index b0cbe2fcdd..74ab89bb98 100644 --- a/esphome/core/runtime_stats.cpp +++ b/esphome/core/runtime_stats.cpp @@ -1,5 +1,6 @@ #include "esphome/core/runtime_stats.h" #include "esphome/core/component.h" +#include namespace esphome { @@ -25,4 +26,53 @@ void RuntimeStatsCollector::record_component_time(Component *component, uint32_t } } +void RuntimeStatsCollector::log_stats_() { + ESP_LOGI(RUNTIME_TAG, "Component Runtime Statistics"); + ESP_LOGI(RUNTIME_TAG, "Period stats (last %" PRIu32 "ms):", this->log_interval_); + + // First collect stats we want to display + std::vector stats_to_display; + + for (const auto &it : this->component_stats_) { + const ComponentRuntimeStats &stats = it.second; + if (stats.get_period_count() > 0) { + ComponentStatPair pair = {it.first, &stats}; + stats_to_display.push_back(pair); + } + } + + // Sort by period runtime (descending) + std::sort(stats_to_display.begin(), stats_to_display.end(), std::greater()); + + // Log top components by period runtime + for (const auto &it : stats_to_display) { + // Only get component name when actually logging + const char *source = it.component->get_component_source(); + const ComponentRuntimeStats *stats = it.stats; + + ESP_LOGI(RUNTIME_TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source, + stats->get_period_count(), stats->get_period_avg_time_ms(), stats->get_period_max_time_ms(), + stats->get_period_time_ms()); + } + + // Log total stats since boot + ESP_LOGI(RUNTIME_TAG, "Total stats (since boot):"); + + // Re-sort by total runtime for all-time stats + std::sort(stats_to_display.begin(), stats_to_display.end(), + [](const ComponentStatPair &a, const ComponentStatPair &b) { + return a.stats->get_total_time_ms() > b.stats->get_total_time_ms(); + }); + + for (const auto &it : stats_to_display) { + // Only get component name when actually logging + const char *source = it.component->get_component_source(); + const ComponentRuntimeStats *stats = it.stats; + + ESP_LOGI(RUNTIME_TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source, + stats->get_total_count(), stats->get_total_avg_time_ms(), stats->get_total_max_time_ms(), + stats->get_total_time_ms()); + } +} + } // namespace esphome \ No newline at end of file diff --git a/esphome/core/runtime_stats.h b/esphome/core/runtime_stats.h index cea11be873..181467e7ce 100644 --- a/esphome/core/runtime_stats.h +++ b/esphome/core/runtime_stats.h @@ -96,54 +96,7 @@ class RuntimeStatsCollector { void record_component_time(Component *component, uint32_t duration_ms, uint32_t current_time); protected: - void log_stats_() { - ESP_LOGI(RUNTIME_TAG, "Component Runtime Statistics"); - ESP_LOGI(RUNTIME_TAG, "Period stats (last %" PRIu32 "ms):", this->log_interval_); - - // First collect stats we want to display - std::vector stats_to_display; - - for (const auto &it : this->component_stats_) { - const ComponentRuntimeStats &stats = it.second; - if (stats.get_period_count() > 0) { - ComponentStatPair pair = {it.first, &stats}; - stats_to_display.push_back(pair); - } - } - - // Sort by period runtime (descending) - std::sort(stats_to_display.begin(), stats_to_display.end(), std::greater()); - - // Log top components by period runtime - for (const auto &it : stats_to_display) { - // Only get component name when actually logging - const char *source = it.component->get_component_source(); - const ComponentRuntimeStats *stats = it.stats; - - ESP_LOGI(RUNTIME_TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source, - stats->get_period_count(), stats->get_period_avg_time_ms(), stats->get_period_max_time_ms(), - stats->get_period_time_ms()); - } - - // Log total stats since boot - ESP_LOGI(RUNTIME_TAG, "Total stats (since boot):"); - - // Re-sort by total runtime for all-time stats - std::sort(stats_to_display.begin(), stats_to_display.end(), - [](const ComponentStatPair &a, const ComponentStatPair &b) { - return a.stats->get_total_time_ms() > b.stats->get_total_time_ms(); - }); - - for (const auto &it : stats_to_display) { - // Only get component name when actually logging - const char *source = it.component->get_component_source(); - const ComponentRuntimeStats *stats = it.stats; - - ESP_LOGI(RUNTIME_TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source, - stats->get_total_count(), stats->get_total_avg_time_ms(), stats->get_total_max_time_ms(), - stats->get_total_time_ms()); - } - } + void log_stats_(); void reset_stats_() { for (auto &it : this->component_stats_) {