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) { if (repeatedFieldOffsets == null) {
repeatedFieldOffsets = EMPTY_INT_ARRAY; repeatedFieldOffsets = EMPTY_INT_ARRAY;
} }
int[] combined = int combinedLength =
new int[checkInitialized.length + mapFieldPositions.length + repeatedFieldOffsets.length]; checkInitialized.length + mapFieldPositions.length + repeatedFieldOffsets.length;
System.arraycopy(checkInitialized, 0, combined, 0, checkInitialized.length); int[] combined;
System.arraycopy( if (combinedLength > 0) {
mapFieldPositions, 0, combined, checkInitialized.length, mapFieldPositions.length); combined = new int[combinedLength];
System.arraycopy( System.arraycopy(checkInitialized, 0, combined, 0, checkInitialized.length);
repeatedFieldOffsets, System.arraycopy(
0, mapFieldPositions, 0, combined, checkInitialized.length, mapFieldPositions.length);
combined, System.arraycopy(
checkInitialized.length + mapFieldPositions.length, repeatedFieldOffsets,
repeatedFieldOffsets.length); 0,
combined,
checkInitialized.length + mapFieldPositions.length,
repeatedFieldOffsets.length);
} else {
combined = EMPTY_INT_ARRAY;
}
return new MessageSchema<T>( return new MessageSchema<T>(
buffer, buffer,

Loading…
Cancel
Save