Performance optimizations

This commit is contained in:
Christian Kratky
2017-11-25 23:10:48 +01:00
parent 24ab285066
commit 611fabcd01
11 changed files with 105 additions and 88 deletions
@@ -1,4 +1,6 @@
using MQTTnet.Adapter;
using System;
using System.Collections.Generic;
using MQTTnet.Adapter;
using MQTTnet.Packets;
namespace MQTTnet.Serializer
@@ -7,7 +9,7 @@ namespace MQTTnet.Serializer
{
MqttProtocolVersion ProtocolVersion { get; set; }
byte[] Serialize(MqttBasePacket mqttPacket);
IEnumerable<ArraySegment<byte>> Serialize(MqttBasePacket mqttPacket);
MqttBasePacket Deserialize(ReceivedMqttPacket receivedMqttPacket);
}
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
@@ -30,7 +29,7 @@ namespace MQTTnet.Serializer
{
return null;
}
var fixedHeader = (byte)buffer;
var controlPacketType = (MqttControlPacketType)(fixedHeader >> 4);
var bodyLength = ReadBodyLengthFromSource(stream, cancellationToken);
@@ -57,12 +56,22 @@ namespace MQTTnet.Serializer
public string ReadStringWithLengthPrefix()
{
var buffer = ReadWithLengthPrefix();
if (buffer.Length == 0)
{
return string.Empty;
}
return Encoding.UTF8.GetString(buffer, 0, buffer.Length);
}
public byte[] ReadWithLengthPrefix()
{
var length = ReadUInt16();
if (length == 0)
{
return new byte[0];
}
return ReadBytes(length);
}
@@ -78,7 +87,7 @@ namespace MQTTnet.Serializer
var value = 0;
byte encodedByte;
var readBytes = new List<int>();
////var readBytes = new List<int>();
do
{
if (cancellationToken.IsCancellationRequested)
@@ -87,19 +96,20 @@ namespace MQTTnet.Serializer
}
var buffer = stream.ReadByte();
readBytes.Add(buffer);
if (buffer == -1)
{
throw new MqttCommunicationException("Connection closed while reading remaining length data.");
}
////readBytes.Add(buffer);
encodedByte = (byte)buffer;
value += (byte)(encodedByte & 127) * multiplier;
multiplier *= 128;
if (multiplier > 128 * 128 * 128)
{
throw new MqttProtocolViolationException($"Remaining length is invalid (Data={string.Join(",", readBytes)}).");
//throw new MqttProtocolViolationException($"Remaining length is invalid (Data={string.Join(",", readBytes)}).");
throw new MqttProtocolViolationException("Remaining length is invalid.");
}
} while ((encodedByte & 128) != 0);
@@ -1,12 +1,12 @@
using System;
using MQTTnet.Adapter;
using MQTTnet.Exceptions;
using MQTTnet.Packets;
using MQTTnet.Protocol;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using MQTTnet.Adapter;
using MQTTnet.Exceptions;
using MQTTnet.Packets;
using MQTTnet.Protocol;
namespace MQTTnet.Serializer
{
@@ -17,25 +17,29 @@ namespace MQTTnet.Serializer
public MqttProtocolVersion ProtocolVersion { get; set; } = MqttProtocolVersion.V311;
public byte[] Serialize(MqttBasePacket packet)
public IEnumerable<ArraySegment<byte>> Serialize(MqttBasePacket packet)
{
if (packet == null) throw new ArgumentNullException(nameof(packet));
using (var stream = new MemoryStream())
using (var stream = new MemoryStream(128))
using (var writer = new MqttPacketWriter(stream))
{
var fixedHeader = SerializePacket(packet, writer);
var headerBuffer = new List<byte> { fixedHeader };
MqttPacketWriter.WriteRemainingLength((int)stream.Length, headerBuffer);
var remainingLength = (int)stream.Length;
writer.Write(fixedHeader);
MqttPacketWriter.WriteRemainingLength(remainingLength, writer);
var headerLength = (int)stream.Length - remainingLength;
var header = headerBuffer.ToArray();
var body = stream.ToArray();
var buffer = new byte[header.Length + body.Length];
Buffer.BlockCopy(header, 0, buffer, 0, header.Length);
Buffer.BlockCopy(body, 0, buffer, header.Length, body.Length);
return buffer;
#if NET461 || NET452 || NETSTANDARD2_0
var buffer = stream.GetBuffer();
#else
var buffer = stream.ToArray();
#endif
return new List<ArraySegment<byte>>
{
new ArraySegment<byte>(buffer, remainingLength, headerLength),
new ArraySegment<byte>(buffer, 0, remainingLength)
};
}
}
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using MQTTnet.Protocol;
@@ -56,11 +55,11 @@ namespace MQTTnet.Serializer
Write(value);
}
public static void WriteRemainingLength(int length, List<byte> target)
public static void WriteRemainingLength(int length, BinaryWriter target)
{
if (length == 0)
{
target.Add(0);
target.Write((byte)0);
return;
}
@@ -75,7 +74,7 @@ namespace MQTTnet.Serializer
encodedByte = encodedByte | 128;
}
target.Add((byte)encodedByte);
target.Write((byte)encodedByte);
} while (x > 0);
}
}