From fab7f928b5375a20fd8d33556632128e936ad436 Mon Sep 17 00:00:00 2001 From: Mike Kruskal Date: Fri, 3 Mar 2023 09:52:58 -0800 Subject: [PATCH] Expand LazySerializerEmitter to cover proto3 cases. This should provide some performance wins for proto3, similar to the ones added years ago for proto2. PiperOrigin-RevId: 513853367 --- src/google/protobuf/compiler/cpp/message.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/google/protobuf/compiler/cpp/message.cc b/src/google/protobuf/compiler/cpp/message.cc index e467f1e5ae4d..e34f19bde369 100644 --- a/src/google/protobuf/compiler/cpp/message.cc +++ b/src/google/protobuf/compiler/cpp/message.cc @@ -3639,8 +3639,6 @@ void MessageGenerator::GenerateSerializeWithCachedSizesBody(io::Printer* p) { LazySerializerEmitter(MessageGenerator* mg, io::Printer* p) : mg_(mg), p_(p), - eager_(mg->descriptor_->file()->syntax() == - FileDescriptor::SYNTAX_PROTO3), cached_has_bit_index_(kNoHasbit) {} ~LazySerializerEmitter() { Flush(); } @@ -3649,13 +3647,14 @@ void MessageGenerator::GenerateSerializeWithCachedSizesBody(io::Printer* p) { // oneof, and handle them at the next Flush(). void Emit(const FieldDescriptor* field) { Formatter format(p_); - if (eager_ || MustFlush(field)) { + + if (!field->has_presence() || MustFlush(field)) { Flush(); } if (!field->real_containing_oneof()) { // TODO(ckennelly): Defer non-oneof fields similarly to oneof fields. - if (!field->options().weak() && !field->is_repeated() && !eager_) { + if (HasHasbit(field) && field->has_presence()) { // We speculatively load the entire _has_bits_[index] contents, even // if it is for only one field. Deferring non-oneof emitting would // allow us to determine whether this is going to be useful. @@ -3699,7 +3698,6 @@ void MessageGenerator::GenerateSerializeWithCachedSizesBody(io::Printer* p) { MessageGenerator* mg_; io::Printer* p_; - bool eager_; std::vector v_; // cached_has_bit_index_ maintains that: