mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Require reserve_size in create_buffer to reduce realloc overhead (#8715)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
		| @@ -212,8 +212,7 @@ void APIConnection::loop() { | |||||||
|     msg_size += 1 + ProtoSize::varint(to_send) + to_send; |     msg_size += 1 + ProtoSize::varint(to_send) + to_send; | ||||||
|     ProtoSize::add_bool_field(msg_size, 1, done); |     ProtoSize::add_bool_field(msg_size, 1, done); | ||||||
|  |  | ||||||
|     auto buffer = this->create_buffer(); |     auto buffer = this->create_buffer(msg_size); | ||||||
|     buffer.get_buffer()->reserve(msg_size); |  | ||||||
|     // fixed32 key = 1; |     // fixed32 key = 1; | ||||||
|     buffer.encode_fixed32(1, esp32_camera::global_esp32_camera->get_object_id_hash()); |     buffer.encode_fixed32(1, esp32_camera::global_esp32_camera->get_object_id_hash()); | ||||||
|     // bytes data = 2; |     // bytes data = 2; | ||||||
| @@ -1807,8 +1806,7 @@ bool APIConnection::try_send_log_message(int level, const char *tag, const char | |||||||
|   msg_size += 1 + api::ProtoSize::varint(static_cast<uint32_t>(line_length)) + line_length; |   msg_size += 1 + api::ProtoSize::varint(static_cast<uint32_t>(line_length)) + line_length; | ||||||
|  |  | ||||||
|   // Create a pre-sized buffer |   // Create a pre-sized buffer | ||||||
|   auto buffer = this->create_buffer(); |   auto buffer = this->create_buffer(msg_size); | ||||||
|   buffer.get_buffer()->reserve(msg_size); |  | ||||||
|  |  | ||||||
|   // Encode the message (SubscribeLogsResponse) |   // Encode the message (SubscribeLogsResponse) | ||||||
|   buffer.encode_uint32(1, static_cast<uint32_t>(level));  // LogLevel level = 1 |   buffer.encode_uint32(1, static_cast<uint32_t>(level));  // LogLevel level = 1 | ||||||
|   | |||||||
| @@ -312,9 +312,10 @@ class APIConnection : public APIServerConnection { | |||||||
|   void on_fatal_error() override; |   void on_fatal_error() override; | ||||||
|   void on_unauthenticated_access() override; |   void on_unauthenticated_access() override; | ||||||
|   void on_no_setup_connection() override; |   void on_no_setup_connection() override; | ||||||
|   ProtoWriteBuffer create_buffer() override { |   ProtoWriteBuffer create_buffer(uint32_t reserve_size) override { | ||||||
|     // FIXME: ensure no recursive writes can happen |     // FIXME: ensure no recursive writes can happen | ||||||
|     this->proto_write_buffer_.clear(); |     this->proto_write_buffer_.clear(); | ||||||
|  |     this->proto_write_buffer_.reserve(reserve_size); | ||||||
|     return {&this->proto_write_buffer_}; |     return {&this->proto_write_buffer_}; | ||||||
|   } |   } | ||||||
|   bool send_buffer(ProtoWriteBuffer buffer, uint32_t message_type) override; |   bool send_buffer(ProtoWriteBuffer buffer, uint32_t message_type) override; | ||||||
|   | |||||||
| @@ -311,7 +311,14 @@ class ProtoService { | |||||||
|   virtual void on_fatal_error() = 0; |   virtual void on_fatal_error() = 0; | ||||||
|   virtual void on_unauthenticated_access() = 0; |   virtual void on_unauthenticated_access() = 0; | ||||||
|   virtual void on_no_setup_connection() = 0; |   virtual void on_no_setup_connection() = 0; | ||||||
|   virtual ProtoWriteBuffer create_buffer() = 0; |   /** | ||||||
|  |    * Create a buffer with a reserved size. | ||||||
|  |    * @param reserve_size The number of bytes to pre-allocate in the buffer. This is a hint | ||||||
|  |    *                     to optimize memory usage and avoid reallocations during encoding. | ||||||
|  |    *                     Implementations should aim to allocate at least this size. | ||||||
|  |    * @return A ProtoWriteBuffer object with the reserved size. | ||||||
|  |    */ | ||||||
|  |   virtual ProtoWriteBuffer create_buffer(uint32_t reserve_size) = 0; | ||||||
|   virtual bool send_buffer(ProtoWriteBuffer buffer, uint32_t message_type) = 0; |   virtual bool send_buffer(ProtoWriteBuffer buffer, uint32_t message_type) = 0; | ||||||
|   virtual bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) = 0; |   virtual bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) = 0; | ||||||
|  |  | ||||||
| @@ -321,8 +328,7 @@ class ProtoService { | |||||||
|     msg.calculate_size(msg_size); |     msg.calculate_size(msg_size); | ||||||
|  |  | ||||||
|     // Create a pre-sized buffer |     // Create a pre-sized buffer | ||||||
|     auto buffer = this->create_buffer(); |     auto buffer = this->create_buffer(msg_size); | ||||||
|     buffer.get_buffer()->reserve(msg_size); |  | ||||||
|  |  | ||||||
|     // Encode message into the buffer |     // Encode message into the buffer | ||||||
|     msg.encode(buffer); |     msg.encode(buffer); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user