|
@@ -323,13 +323,16 @@ namespace Google.Protobuf
|
|
|
/// </summary>
|
|
|
public static uint ParseRawLittleEndian32(ref ReadOnlySpan<byte> buffer, ref ParserInternalState state)
|
|
|
{
|
|
|
- const int length = sizeof(uint);
|
|
|
- if (state.bufferPos + length > state.bufferSize)
|
|
|
+ const int uintLength = sizeof(uint);
|
|
|
+ const int ulongLength = sizeof(ulong);
|
|
|
+ if (state.bufferPos + ulongLength > state.bufferSize)
|
|
|
{
|
|
|
return ParseRawLittleEndian32SlowPath(ref buffer, ref state);
|
|
|
}
|
|
|
- uint result = BinaryPrimitives.ReadUInt32LittleEndian(buffer.Slice(state.bufferPos, length));
|
|
|
- state.bufferPos += length;
|
|
|
+ // ReadUInt32LittleEndian is many times slower than ReadUInt64LittleEndian (at least on some runtimes)
|
|
|
+ // so it's faster better to use ReadUInt64LittleEndian and truncate the result.
|
|
|
+ uint result = (uint) BinaryPrimitives.ReadUInt64LittleEndian(buffer.Slice(state.bufferPos, ulongLength));
|
|
|
+ state.bufferPos += uintLength;
|
|
|
return result;
|
|
|
}
|
|
|
|