Optimize package serializing and dispatching.

This commit is contained in:
Christian Kratky
2018-06-05 21:13:58 +02:00
parent c88b46783b
commit 31b4eb7937
9 changed files with 103 additions and 71 deletions
@@ -139,37 +139,36 @@ namespace MQTTnet.Adapter
{
ReadingPacketStarted?.Invoke(this, EventArgs.Empty);
var bodyLength = await MqttPacketReader.ReadBodyLengthAsync(channel, cancellationToken).ConfigureAwait(false);
if (bodyLength == 0)
if (fixedHeader.RemainingLength == 0)
{
return new ReceivedMqttPacket(fixedHeader, null);
return new ReceivedMqttPacket(fixedHeader.Flags, null);
}
var body = new MemoryStream(bodyLength);
var body = new MemoryStream(fixedHeader.RemainingLength);
var buffer = new byte[Math.Min(ReadBufferSize, bodyLength)];
while (body.Length < bodyLength)
var buffer = new byte[Math.Min(ReadBufferSize, fixedHeader.RemainingLength)];
while (body.Length < fixedHeader.RemainingLength)
{
var bytesLeft = bodyLength - (int)body.Length;
var bytesLeft = fixedHeader.RemainingLength - (int)body.Length;
if (bytesLeft > buffer.Length)
{
bytesLeft = buffer.Length;
}
var readBytesCount = await channel.ReadAsync(buffer, 0, bytesLeft, cancellationToken).ConfigureAwait(false);
if (readBytesCount <= 0)
var readBytes = await channel.ReadAsync(buffer, 0, bytesLeft, cancellationToken).ConfigureAwait(false);
if (readBytes <= 0)
{
ExceptionHelper.ThrowGracefulSocketClose();
}
// Here is no need to await because internally only an array is used and no real I/O operation is made.
// Using async here will only generate overhead.
body.Write(buffer, 0, readBytesCount);
body.Write(buffer, 0, readBytes);
}
body.Seek(0L, SeekOrigin.Begin);
return new ReceivedMqttPacket(fixedHeader, body);
return new ReceivedMqttPacket(fixedHeader.Flags, body);
}
finally
{