Reuse empty int[0] in MessageSchema.intValue to save allocations

This should save a little memory. We've observed hundreds of such empty arrays
in some applications.

This affects non-empty messages with none of:
- repeated fields
- map fields
- fields to check if they're initialized

PiperOrigin-RevId: 658137927
pull/17640/head
Mark Hansen 8 months ago committed by Copybara-Service
parent 6fdcc0beb4
commit f9ecda5f3c
  1. 28
      java/core/src/main/java/com/google/protobuf/MessageSchema.java

@ -700,17 +700,23 @@ final class MessageSchema<T> implements Schema<T> {
if (repeatedFieldOffsets == null) {
repeatedFieldOffsets = EMPTY_INT_ARRAY;
}
int[] combined =
new int[checkInitialized.length + mapFieldPositions.length + repeatedFieldOffsets.length];
System.arraycopy(checkInitialized, 0, combined, 0, checkInitialized.length);
System.arraycopy(
mapFieldPositions, 0, combined, checkInitialized.length, mapFieldPositions.length);
System.arraycopy(
repeatedFieldOffsets,
0,
combined,
checkInitialized.length + mapFieldPositions.length,
repeatedFieldOffsets.length);
int combinedLength =
checkInitialized.length + mapFieldPositions.length + repeatedFieldOffsets.length;
int[] combined;
if (combinedLength > 0) {
combined = new int[combinedLength];
System.arraycopy(checkInitialized, 0, combined, 0, checkInitialized.length);
System.arraycopy(
mapFieldPositions, 0, combined, checkInitialized.length, mapFieldPositions.length);
System.arraycopy(
repeatedFieldOffsets,
0,
combined,
checkInitialized.length + mapFieldPositions.length,
repeatedFieldOffsets.length);
} else {
combined = EMPTY_INT_ARRAY;
}
return new MessageSchema<T>(
buffer,

Loading…
Cancel
Save