[api] Combine reserve_and_resize + resize in encode_to_buffer

For non-first batch messages, fold the payload resize into the
reserve_and_resize call. This eliminates a redundant size() read,
a redundant capacity check, and an extra jump on the hot path.

Saves 17 bytes in encode_to_buffer (130 → 113) and ~5 instructions
on the second-message path.
This commit is contained in:
J. Nick Koston
2026-04-01 10:57:46 -10:00
parent d82cc0c08a
commit 09648b86f9
+7 -5
View File
@@ -2023,19 +2023,21 @@ uint16_t APIConnection::encode_to_buffer(uint32_t calculated_size, MessageEncode
auto &shared_buf = conn->parent_->get_shared_buffer_ref();
size_t write_start;
if (conn->flags_.batch_first_message) {
// First message - buffer already prepared by caller, just clear flag
conn->flags_.batch_first_message = false;
write_start = shared_buf.size();
shared_buf.resize(write_start + calculated_size);
} else {
// Batch message second or later
// Add padding for previous message footer + this message header
// Reserve for full message, resize to include footer gap + header padding + payload
size_t current_size = shared_buf.size();
shared_buf.reserve_and_resize(current_size + total_calculated_size, current_size + footer_size + header_padding);
shared_buf.reserve_and_resize(current_size + total_calculated_size,
current_size + footer_size + header_padding + calculated_size);
write_start = shared_buf.size() - calculated_size;
}
// Pre-resize buffer to include payload, then encode through raw pointer
size_t write_start = shared_buf.size();
shared_buf.resize(write_start + calculated_size);
ProtoWriteBuffer buffer{&shared_buf, write_start};
encode_fn(msg, buffer);