mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00: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:
		| @@ -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 { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user