optimize WriteVarint32

pull/7576/head
Jan Tattermusch 5 years ago
parent 9ca0877db1
commit 9d53fadcac
  1. 28
      csharp/src/Google.Protobuf/WritingPrimitives.cs

@ -289,30 +289,34 @@ namespace Google.Protobuf
public static void WriteRawVarint32(ref Span<byte> buffer, ref WriterInternalState state, uint value) public static void WriteRawVarint32(ref Span<byte> buffer, ref WriterInternalState state, uint value)
{ {
// Optimize for the common case of a single byte value // Optimize for the common case of a single byte value
if (value < 128 && state.position < state.limit) if (value < 128 && state.position < buffer.Length)
{ {
buffer[state.position++] = (byte)value; buffer[state.position++] = (byte)value;
return; return;
} }
while (value > 127 && state.position < state.limit) // Fast path when capacity is available
while (state.position < buffer.Length)
{ {
buffer[state.position++] = (byte)((value & 0x7F) | 0x80); if (value > 127)
value >>= 7; {
buffer[state.position++] = (byte)((value & 0x7F) | 0x80);
value >>= 7;
}
else
{
buffer[state.position++] = (byte)value;
return;
}
} }
while (value > 127) while (value > 127)
{ {
WriteRawByte(ref buffer, ref state, (byte)((value & 0x7F) | 0x80)); WriteRawByte(ref buffer, ref state, (byte)((value & 0x7F) | 0x80));
value >>= 7; value >>= 7;
} }
if (state.position < state.limit)
{ WriteRawByte(ref buffer, ref state, (byte)value);
buffer[state.position++] = (byte)value;
}
else
{
WriteRawByte(ref buffer, ref state, (byte)value);
}
} }
public static void WriteRawVarint64(ref Span<byte> buffer, ref WriterInternalState state, ulong value) public static void WriteRawVarint64(ref Span<byte> buffer, ref WriterInternalState state, ulong value)

Loading…
Cancel
Save