Perf in MessageParsers (#1616)
This commit is contained in:
parent
1eb64712fb
commit
9839e6b07b
|
|
@ -7,15 +7,13 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Formatters
|
||||||
{
|
{
|
||||||
public static class BinaryMessageParser
|
public static class BinaryMessageParser
|
||||||
{
|
{
|
||||||
private static int[] _numBitsToShift = new[] { 0, 7, 14, 21, 28 };
|
|
||||||
private const int MaxLengthPrefixSize = 5;
|
private const int MaxLengthPrefixSize = 5;
|
||||||
|
|
||||||
public static bool TryParseMessage(ref ReadOnlySpan<byte> buffer, out ReadOnlySpan<byte> payload)
|
public static bool TryParseMessage(ref ReadOnlySpan<byte> buffer, out ReadOnlySpan<byte> payload)
|
||||||
{
|
{
|
||||||
payload = default;
|
|
||||||
|
|
||||||
if (buffer.IsEmpty)
|
if (buffer.IsEmpty)
|
||||||
{
|
{
|
||||||
|
payload = default;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,7 +37,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Formatters
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
byteRead = lengthPrefixBuffer[numBytes];
|
byteRead = lengthPrefixBuffer[numBytes];
|
||||||
length = length | (((uint)(byteRead & 0x7f)) << _numBitsToShift[numBytes]);
|
length = length | (((uint)(byteRead & 0x7f)) << (numBytes * 7));
|
||||||
numBytes++;
|
numBytes++;
|
||||||
}
|
}
|
||||||
while (numBytes < lengthPrefixBuffer.Length && ((byteRead & 0x80) != 0));
|
while (numBytes < lengthPrefixBuffer.Length && ((byteRead & 0x80) != 0));
|
||||||
|
|
@ -47,6 +45,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Formatters
|
||||||
// size bytes are missing
|
// size bytes are missing
|
||||||
if ((byteRead & 0x80) != 0 && (numBytes < MaxLengthPrefixSize))
|
if ((byteRead & 0x80) != 0 && (numBytes < MaxLengthPrefixSize))
|
||||||
{
|
{
|
||||||
|
payload = default;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -58,6 +57,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Formatters
|
||||||
// We don't have enough data
|
// We don't have enough data
|
||||||
if (buffer.Length < length + numBytes)
|
if (buffer.Length < length + numBytes)
|
||||||
{
|
{
|
||||||
|
payload = default;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,10 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Formatters
|
||||||
{
|
{
|
||||||
public static bool TryParseMessage(ref ReadOnlySpan<byte> buffer, out ReadOnlySpan<byte> payload)
|
public static bool TryParseMessage(ref ReadOnlySpan<byte> buffer, out ReadOnlySpan<byte> payload)
|
||||||
{
|
{
|
||||||
payload = default;
|
|
||||||
|
|
||||||
var index = buffer.IndexOf(TextMessageFormatter.RecordSeparator);
|
var index = buffer.IndexOf(TextMessageFormatter.RecordSeparator);
|
||||||
if (index == -1)
|
if (index == -1)
|
||||||
{
|
{
|
||||||
|
payload = default;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue