1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-02 03:12:20 +01:00

[esp32] Optimize preferences is_changed() by replacing temporary vector with unique_ptr (#10246)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
J. Nick Koston
2025-08-15 10:11:49 -05:00
committed by GitHub
parent abecc0e8d8
commit 6c5632a0b3

View File

@@ -8,6 +8,7 @@
#include <cinttypes> #include <cinttypes>
#include <vector> #include <vector>
#include <string> #include <string>
#include <memory>
namespace esphome { namespace esphome {
namespace esp32 { namespace esp32 {
@@ -156,20 +157,23 @@ class ESP32Preferences : public ESPPreferences {
return failed == 0; return failed == 0;
} }
bool is_changed(const uint32_t nvs_handle, const NVSData &to_save) { bool is_changed(const uint32_t nvs_handle, const NVSData &to_save) {
NVSData stored_data{};
size_t actual_len; size_t actual_len;
esp_err_t err = nvs_get_blob(nvs_handle, to_save.key.c_str(), nullptr, &actual_len); esp_err_t err = nvs_get_blob(nvs_handle, to_save.key.c_str(), nullptr, &actual_len);
if (err != 0) { if (err != 0) {
ESP_LOGV(TAG, "nvs_get_blob('%s'): %s - the key might not be set yet", to_save.key.c_str(), esp_err_to_name(err)); ESP_LOGV(TAG, "nvs_get_blob('%s'): %s - the key might not be set yet", to_save.key.c_str(), esp_err_to_name(err));
return true; return true;
} }
stored_data.data.resize(actual_len); // Check size first before allocating memory
err = nvs_get_blob(nvs_handle, to_save.key.c_str(), stored_data.data.data(), &actual_len); if (actual_len != to_save.data.size()) {
return true;
}
auto stored_data = std::make_unique<uint8_t[]>(actual_len);
err = nvs_get_blob(nvs_handle, to_save.key.c_str(), stored_data.get(), &actual_len);
if (err != 0) { if (err != 0) {
ESP_LOGV(TAG, "nvs_get_blob('%s') failed: %s", to_save.key.c_str(), esp_err_to_name(err)); ESP_LOGV(TAG, "nvs_get_blob('%s') failed: %s", to_save.key.c_str(), esp_err_to_name(err));
return true; return true;
} }
return to_save.data != stored_data.data; return memcmp(to_save.data.data(), stored_data.get(), to_save.data.size()) != 0;
} }
bool reset() override { bool reset() override {