Add prefetch to RepeatedPtrFieldBase::MergeFrom

PiperOrigin-RevId: 691136548
pull/19034/head
Ilya Tokar 4 months ago committed by Copybara-Service
parent cf9b7747da
commit a850a5c92a
  1. 10
      src/google/protobuf/repeated_ptr_field.cc

@ -19,6 +19,7 @@
#include <new>
#include <string>
#include "absl/base/prefetch.h"
#include "absl/log/absl_check.h"
#include "google/protobuf/arena.h"
#include "google/protobuf/message_lite.h"
@ -191,12 +192,21 @@ void RepeatedPtrFieldBase::MergeFromConcreteMessage(
void** dst = InternalReserve(new_size);
const void* const* src = from.elements();
auto end = src + from.current_size_;
constexpr ptrdiff_t kPrefetchstride = 1;
if (PROTOBUF_PREDICT_FALSE(ClearedCount() > 0)) {
int recycled = MergeIntoClearedMessages(from);
dst += recycled;
src += recycled;
}
Arena* arena = GetArena();
if (from.current_size_ >= kPrefetchstride) {
auto prefetch_end = end - kPrefetchstride;
for (; src < prefetch_end; ++src, ++dst) {
auto next = src + kPrefetchstride;
absl::PrefetchToLocalCache(*next);
*dst = copy_fn(arena, *src);
}
}
for (; src < end; ++src, ++dst) {
*dst = copy_fn(arena, *src);
}

Loading…
Cancel
Save