Skip to content

Allocation improvements #753

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions projects/client/Apigen/src/apigen/Apigen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,7 @@ public void EmitClassProperties(AmqpClass c)
EmitLine($" public override ushort ProtocolClassId => {c.Index};");
EmitLine($" public override string ProtocolClassName => \"{c.Name}\";");
EmitLine("");
EmitLine(" internal override void ReadPropertiesFrom(Client.Impl.ContentHeaderPropertyReader reader)");
EmitLine(" internal override void ReadPropertiesFrom(ref Client.Impl.ContentHeaderPropertyReader reader)");
EmitLine(" {");
foreach (AmqpField f in c.m_Fields)
{
Expand All @@ -660,7 +660,7 @@ public void EmitClassProperties(AmqpClass c)
}
EmitLine(" }");
EmitLine("");
EmitLine(" internal override void WritePropertiesTo(Client.Impl.ContentHeaderPropertyWriter writer)");
EmitLine(" internal override void WritePropertiesTo(ref Client.Impl.ContentHeaderPropertyWriter writer)");
EmitLine(" {");
foreach (AmqpField f in c.m_Fields)
{
Expand Down Expand Up @@ -841,15 +841,15 @@ public void EmitClassMethodImplementations(AmqpClass c)
EmitLine($" public override string ProtocolMethodName => \"{c.Name}.{m.Name}\";");
EmitLine($" public override bool HasContent => {(m.HasContent ? "true" : "false")};");
EmitLine("");
EmitLine(" public override void ReadArgumentsFrom(Client.Impl.MethodArgumentReader reader)");
EmitLine(" public override void ReadArgumentsFrom(ref Client.Impl.MethodArgumentReader reader)");
EmitLine(" {");
foreach (AmqpField f in m.m_Fields)
{
EmitLine($" _{MangleMethod(f.Name)} = reader.Read{MangleClass(ResolveDomain(f.Domain))}();");
}
EmitLine(" }");
EmitLine("");
EmitLine(" public override void WriteArgumentsTo(Client.Impl.MethodArgumentWriter writer)");
EmitLine(" public override void WriteArgumentsTo(ref Client.Impl.MethodArgumentWriter writer)");
EmitLine(" {");
foreach (AmqpField f in m.m_Fields)
{
Expand Down Expand Up @@ -936,7 +936,8 @@ public void EmitMethodArgumentReader()
EmitLine(" Client.Impl.MethodBase result = DecodeMethodFrom(classId, methodId);");
EmitLine(" if(result != null)");
EmitLine(" {");
EmitLine(" result.ReadArgumentsFrom(new Client.Impl.MethodArgumentReader(memory.Slice(4)));");
EmitLine(" Client.Impl.MethodArgumentReader reader = new Client.Impl.MethodArgumentReader(memory.Slice(4));");
EmitLine(" result.ReadArgumentsFrom(ref reader);");
EmitLine(" return result;");
EmitLine(" }");
EmitLine("");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,13 @@ internal ulong ReadFrom(ReadOnlyMemory<byte> memory)
{
// Skipping the first two bytes since they arent used (weight - not currently used)
ulong bodySize = NetworkOrderDeserializer.ReadUInt64(memory.Slice(2));
ReadPropertiesFrom(new ContentHeaderPropertyReader(memory.Slice(10)));
ContentHeaderPropertyReader reader = new ContentHeaderPropertyReader(memory.Slice(10));
ReadPropertiesFrom(ref reader);
return bodySize;
}

internal abstract void ReadPropertiesFrom(ContentHeaderPropertyReader reader);
internal abstract void WritePropertiesTo(ContentHeaderPropertyWriter writer);
internal abstract void ReadPropertiesFrom(ref ContentHeaderPropertyReader reader);
internal abstract void WritePropertiesTo(ref ContentHeaderPropertyWriter writer);

private const ushort ZERO = 0;

Expand All @@ -86,7 +87,7 @@ internal int WriteTo(Memory<byte> memory, ulong bodySize)
NetworkOrderSerializer.WriteUInt64(memory.Slice(2), bodySize);

ContentHeaderPropertyWriter writer = new ContentHeaderPropertyWriter(memory.Slice(10));
WritePropertiesTo(writer);
WritePropertiesTo(ref writer);
return 10 + writer.Offset;
}
public int GetRequiredBufferSize()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,17 @@

namespace RabbitMQ.Client.Impl
{
class ContentHeaderPropertyReader
struct ContentHeaderPropertyReader
{
protected ushort m_bitCount;
protected ushort m_flagWord;
private int _memoryOffset = 0;
private ushort m_bitCount;
private ushort m_flagWord;
private int _memoryOffset;
private readonly ReadOnlyMemory<byte> _memory;

public ContentHeaderPropertyReader(ReadOnlyMemory<byte> memory)
{
_memory = memory;
_memoryOffset = 0;
m_flagWord = 1; // just the continuation bit
m_bitCount = 15; // the correct position to force a m_flagWord read
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,19 @@

namespace RabbitMQ.Client.Impl
{
class ContentHeaderPropertyWriter
struct ContentHeaderPropertyWriter
{
protected int m_bitCount;
protected ushort m_flagWord;
public int Offset { get; private set; } = 0;
private int _bitCount;
private ushort _flagWord;
public int Offset { get; private set; }
public Memory<byte> Memory { get; private set; }

public ContentHeaderPropertyWriter(Memory<byte> memory)
{
Memory = memory;
m_flagWord = 0;
m_bitCount = 0;
_flagWord = 0;
_bitCount = 0;
Offset = 0;
}

public void FinishPresence()
Expand Down Expand Up @@ -91,17 +92,17 @@ public void WriteOctet(byte val)

public void WritePresence(bool present)
{
if (m_bitCount == 15)
if (_bitCount == 15)
{
EmitFlagWord(true);
}

if (present)
{
int bit = 15 - m_bitCount;
m_flagWord = (ushort)(m_flagWord | (1 << bit));
int bit = 15 - _bitCount;
_flagWord = (ushort)(_flagWord | (1 << bit));
}
m_bitCount++;
_bitCount++;
}

public void WriteShort(ushort val)
Expand All @@ -126,10 +127,10 @@ public void WriteTimestamp(AmqpTimestamp val)

private void EmitFlagWord(bool continuationBit)
{
NetworkOrderSerializer.WriteUInt16(Memory.Slice(Offset), (ushort)(continuationBit ? (m_flagWord | 1) : m_flagWord));
NetworkOrderSerializer.WriteUInt16(Memory.Slice(Offset), (ushort)(continuationBit ? (_flagWord | 1) : _flagWord));
Offset += 2;
m_flagWord = 0;
m_bitCount = 0;
_flagWord = 0;
_bitCount = 0;
}
}
}
2 changes: 1 addition & 1 deletion projects/client/RabbitMQ.Client/src/client/impl/Frame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ internal override int WritePayload(Memory<byte> memory)
NetworkOrderSerializer.WriteUInt16(memory, _method.ProtocolClassId);
NetworkOrderSerializer.WriteUInt16(memory.Slice(2), _method.ProtocolMethodId);
var argWriter = new MethodArgumentWriter(memory.Slice(4));
_method.WriteArgumentsTo(argWriter);
_method.WriteArgumentsTo(ref argWriter);
argWriter.Flush();
return 4 + argWriter.Offset;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@

namespace RabbitMQ.Client.Impl
{
class MethodArgumentReader
struct MethodArgumentReader
{
private int? _bit;
private int _bits;
Expand All @@ -54,7 +54,8 @@ public MethodArgumentReader(ReadOnlyMemory<byte> memory)
{
_memory = memory;
_memoryOffset = 0;
ClearBits();
_bits = 0;
_bit = null;
}

private readonly ReadOnlyMemory<byte> _memory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,21 @@

namespace RabbitMQ.Client.Impl
{
class MethodArgumentWriter
struct MethodArgumentWriter
{
private byte _bitAccumulator;
private int _bitMask;
private bool _needBitFlush;
public int Offset { get; private set; } = 0;
public int Offset { get; private set; }
public Memory<byte> Memory { get; private set; }

public MethodArgumentWriter(Memory<byte> memory)
{
Memory = memory;
ResetBitAccumulator();
_needBitFlush = false;
_bitAccumulator = 0;
_bitMask = 1;
Offset = 0;
}

public void Flush()
Expand Down
4 changes: 2 additions & 2 deletions projects/client/RabbitMQ.Client/src/client/impl/MethodBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ abstract class MethodBase : IMethod
public abstract string ProtocolMethodName { get; }

public abstract void AppendArgumentDebugStringTo(StringBuilder stringBuilder);
public abstract void ReadArgumentsFrom(MethodArgumentReader reader);
public abstract void WriteArgumentsTo(MethodArgumentWriter writer);
public abstract void ReadArgumentsFrom(ref MethodArgumentReader reader);
public abstract void WriteArgumentsTo(ref MethodArgumentWriter writer);
public abstract int GetRequiredBufferSize();
}
}
4 changes: 2 additions & 2 deletions projects/client/Unit/src/unit/TestBasicProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,12 @@ public void TestNullableProperties_CanWrite(
Assert.AreEqual(isMessageIdPresent, subject.IsMessageIdPresent());

var writer = new Impl.ContentHeaderPropertyWriter(new byte[1024]);
subject.WritePropertiesTo(writer);
subject.WritePropertiesTo(ref writer);

// Read from Stream
var propertiesFromStream = new Framing.BasicProperties();
var reader = new Impl.ContentHeaderPropertyReader(writer.Memory.Slice(0, writer.Offset));
propertiesFromStream.ReadPropertiesFrom(reader);
propertiesFromStream.ReadPropertiesFrom(ref reader);

Assert.AreEqual(clusterId, propertiesFromStream.ClusterId);
Assert.AreEqual(correlationId, propertiesFromStream.CorrelationId);
Expand Down