From 1244b2c25d3c37978cec4080c8a7443f2716a65f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Mar 2026 20:18:03 -1000 Subject: [PATCH 1/2] [logger] Inline ANSI reset sequence in LogBuffer::finalize_() Replace write_() call with direct char stores for the 4-byte ANSI reset sequence ("\033[0m"). This eliminates function call overhead (entry/retw, bounds check, memcpy setup) on every log message and avoids a rodata string reference that consumes RAM on ESP8266. --- esphome/components/logger/log_buffer.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/esphome/components/logger/log_buffer.h b/esphome/components/logger/log_buffer.h index a56276f732..30c859cf8a 100644 --- a/esphome/components/logger/log_buffer.h +++ b/esphome/components/logger/log_buffer.h @@ -128,12 +128,21 @@ struct LogBuffer { } } void finalize_() { - // Write color reset sequence - static constexpr uint16_t RESET_COLOR_LEN = sizeof(ESPHOME_LOG_RESET_COLOR) - 1; - this->write_(ESPHOME_LOG_RESET_COLOR, RESET_COLOR_LEN); + this->write_ansi_reset_(); // Null terminate this->data[this->full_() ? this->size - 1 : this->pos] = '\0'; } + // Write ANSI reset sequence inline (4 bytes: "\033[0m") - avoids write_() call overhead + void write_ansi_reset_() { + if (this->remaining_() >= 4) { + char *p = this->current_(); + *p++ = '\033'; + *p++ = '['; + *p++ = '0'; + *p++ = 'm'; + this->pos += 4; + } + } void strip_trailing_newlines_() { while (this->pos > 0 && this->data[this->pos - 1] == '\n') this->pos--; From d201cc5d6497584c1391a2648d112357cc3e0fd8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Mar 2026 20:19:34 -1000 Subject: [PATCH 2/2] [logger] Use constexpr for ANSI reset sequence length --- esphome/components/logger/log_buffer.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/esphome/components/logger/log_buffer.h b/esphome/components/logger/log_buffer.h index 30c859cf8a..279ec6d371 100644 --- a/esphome/components/logger/log_buffer.h +++ b/esphome/components/logger/log_buffer.h @@ -132,15 +132,16 @@ struct LogBuffer { // Null terminate this->data[this->full_() ? this->size - 1 : this->pos] = '\0'; } - // Write ANSI reset sequence inline (4 bytes: "\033[0m") - avoids write_() call overhead + // Write ANSI reset sequence inline ("\033[0m") - avoids write_() call overhead + static constexpr uint16_t ANSI_RESET_LEN = 4; // "\033[0m" void write_ansi_reset_() { - if (this->remaining_() >= 4) { + if (this->remaining_() >= ANSI_RESET_LEN) { char *p = this->current_(); *p++ = '\033'; *p++ = '['; *p++ = '0'; *p++ = 'm'; - this->pos += 4; + this->pos += ANSI_RESET_LEN; } } void strip_trailing_newlines_() {