Skip to content

Commit f5318de

Browse files
Merge pull request #753 from Anarh2404/improvements
Allocation improvements
2 parents 384b1c3 + c785c0f commit f5318de

File tree

9 files changed

+44
-36
lines changed

9 files changed

+44
-36
lines changed

projects/client/Apigen/src/apigen/Apigen.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ public void EmitClassProperties(AmqpClass c)
637637
EmitLine($" public override ushort ProtocolClassId => {c.Index};");
638638
EmitLine($" public override string ProtocolClassName => \"{c.Name}\";");
639639
EmitLine("");
640-
EmitLine(" internal override void ReadPropertiesFrom(Client.Impl.ContentHeaderPropertyReader reader)");
640+
EmitLine(" internal override void ReadPropertiesFrom(ref Client.Impl.ContentHeaderPropertyReader reader)");
641641
EmitLine(" {");
642642
foreach (AmqpField f in c.m_Fields)
643643
{
@@ -660,7 +660,7 @@ public void EmitClassProperties(AmqpClass c)
660660
}
661661
EmitLine(" }");
662662
EmitLine("");
663-
EmitLine(" internal override void WritePropertiesTo(Client.Impl.ContentHeaderPropertyWriter writer)");
663+
EmitLine(" internal override void WritePropertiesTo(ref Client.Impl.ContentHeaderPropertyWriter writer)");
664664
EmitLine(" {");
665665
foreach (AmqpField f in c.m_Fields)
666666
{
@@ -841,15 +841,15 @@ public void EmitClassMethodImplementations(AmqpClass c)
841841
EmitLine($" public override string ProtocolMethodName => \"{c.Name}.{m.Name}\";");
842842
EmitLine($" public override bool HasContent => {(m.HasContent ? "true" : "false")};");
843843
EmitLine("");
844-
EmitLine(" public override void ReadArgumentsFrom(Client.Impl.MethodArgumentReader reader)");
844+
EmitLine(" public override void ReadArgumentsFrom(ref Client.Impl.MethodArgumentReader reader)");
845845
EmitLine(" {");
846846
foreach (AmqpField f in m.m_Fields)
847847
{
848848
EmitLine($" _{MangleMethod(f.Name)} = reader.Read{MangleClass(ResolveDomain(f.Domain))}();");
849849
}
850850
EmitLine(" }");
851851
EmitLine("");
852-
EmitLine(" public override void WriteArgumentsTo(Client.Impl.MethodArgumentWriter writer)");
852+
EmitLine(" public override void WriteArgumentsTo(ref Client.Impl.MethodArgumentWriter writer)");
853853
EmitLine(" {");
854854
foreach (AmqpField f in m.m_Fields)
855855
{
@@ -936,7 +936,8 @@ public void EmitMethodArgumentReader()
936936
EmitLine(" Client.Impl.MethodBase result = DecodeMethodFrom(classId, methodId);");
937937
EmitLine(" if(result != null)");
938938
EmitLine(" {");
939-
EmitLine(" result.ReadArgumentsFrom(new Client.Impl.MethodArgumentReader(memory.Slice(4)));");
939+
EmitLine(" Client.Impl.MethodArgumentReader reader = new Client.Impl.MethodArgumentReader(memory.Slice(4));");
940+
EmitLine(" result.ReadArgumentsFrom(ref reader);");
940941
EmitLine(" return result;");
941942
EmitLine(" }");
942943
EmitLine("");

projects/client/RabbitMQ.Client/src/client/impl/ContentHeaderBase.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,13 @@ internal ulong ReadFrom(ReadOnlyMemory<byte> memory)
7171
{
7272
// Skipping the first two bytes since they arent used (weight - not currently used)
7373
ulong bodySize = NetworkOrderDeserializer.ReadUInt64(memory.Slice(2));
74-
ReadPropertiesFrom(new ContentHeaderPropertyReader(memory.Slice(10)));
74+
ContentHeaderPropertyReader reader = new ContentHeaderPropertyReader(memory.Slice(10));
75+
ReadPropertiesFrom(ref reader);
7576
return bodySize;
7677
}
7778

78-
internal abstract void ReadPropertiesFrom(ContentHeaderPropertyReader reader);
79-
internal abstract void WritePropertiesTo(ContentHeaderPropertyWriter writer);
79+
internal abstract void ReadPropertiesFrom(ref ContentHeaderPropertyReader reader);
80+
internal abstract void WritePropertiesTo(ref ContentHeaderPropertyWriter writer);
8081

8182
private const ushort ZERO = 0;
8283

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

8889
ContentHeaderPropertyWriter writer = new ContentHeaderPropertyWriter(memory.Slice(10));
89-
WritePropertiesTo(writer);
90+
WritePropertiesTo(ref writer);
9091
return 10 + writer.Offset;
9192
}
9293
public int GetRequiredBufferSize()

projects/client/RabbitMQ.Client/src/client/impl/ContentHeaderPropertyReader.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,17 @@
4545

4646
namespace RabbitMQ.Client.Impl
4747
{
48-
class ContentHeaderPropertyReader
48+
struct ContentHeaderPropertyReader
4949
{
50-
protected ushort m_bitCount;
51-
protected ushort m_flagWord;
52-
private int _memoryOffset = 0;
50+
private ushort m_bitCount;
51+
private ushort m_flagWord;
52+
private int _memoryOffset;
5353
private readonly ReadOnlyMemory<byte> _memory;
5454

5555
public ContentHeaderPropertyReader(ReadOnlyMemory<byte> memory)
5656
{
5757
_memory = memory;
58+
_memoryOffset = 0;
5859
m_flagWord = 1; // just the continuation bit
5960
m_bitCount = 15; // the correct position to force a m_flagWord read
6061
}

projects/client/RabbitMQ.Client/src/client/impl/ContentHeaderPropertyWriter.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,19 @@
4545

4646
namespace RabbitMQ.Client.Impl
4747
{
48-
class ContentHeaderPropertyWriter
48+
struct ContentHeaderPropertyWriter
4949
{
50-
protected int m_bitCount;
51-
protected ushort m_flagWord;
52-
public int Offset { get; private set; } = 0;
50+
private int _bitCount;
51+
private ushort _flagWord;
52+
public int Offset { get; private set; }
5353
public Memory<byte> Memory { get; private set; }
5454

5555
public ContentHeaderPropertyWriter(Memory<byte> memory)
5656
{
5757
Memory = memory;
58-
m_flagWord = 0;
59-
m_bitCount = 0;
58+
_flagWord = 0;
59+
_bitCount = 0;
60+
Offset = 0;
6061
}
6162

6263
public void FinishPresence()
@@ -91,17 +92,17 @@ public void WriteOctet(byte val)
9192

9293
public void WritePresence(bool present)
9394
{
94-
if (m_bitCount == 15)
95+
if (_bitCount == 15)
9596
{
9697
EmitFlagWord(true);
9798
}
9899

99100
if (present)
100101
{
101-
int bit = 15 - m_bitCount;
102-
m_flagWord = (ushort)(m_flagWord | (1 << bit));
102+
int bit = 15 - _bitCount;
103+
_flagWord = (ushort)(_flagWord | (1 << bit));
103104
}
104-
m_bitCount++;
105+
_bitCount++;
105106
}
106107

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

127128
private void EmitFlagWord(bool continuationBit)
128129
{
129-
NetworkOrderSerializer.WriteUInt16(Memory.Slice(Offset), (ushort)(continuationBit ? (m_flagWord | 1) : m_flagWord));
130+
NetworkOrderSerializer.WriteUInt16(Memory.Slice(Offset), (ushort)(continuationBit ? (_flagWord | 1) : _flagWord));
130131
Offset += 2;
131-
m_flagWord = 0;
132-
m_bitCount = 0;
132+
_flagWord = 0;
133+
_bitCount = 0;
133134
}
134135
}
135136
}

projects/client/RabbitMQ.Client/src/client/impl/Frame.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ internal override int WritePayload(Memory<byte> memory)
117117
NetworkOrderSerializer.WriteUInt16(memory, _method.ProtocolClassId);
118118
NetworkOrderSerializer.WriteUInt16(memory.Slice(2), _method.ProtocolMethodId);
119119
var argWriter = new MethodArgumentWriter(memory.Slice(4));
120-
_method.WriteArgumentsTo(argWriter);
120+
_method.WriteArgumentsTo(ref argWriter);
121121
argWriter.Flush();
122122
return 4 + argWriter.Offset;
123123
}

projects/client/RabbitMQ.Client/src/client/impl/MethodArgumentReader.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
namespace RabbitMQ.Client.Impl
4747
{
48-
class MethodArgumentReader
48+
struct MethodArgumentReader
4949
{
5050
private int? _bit;
5151
private int _bits;
@@ -54,7 +54,8 @@ public MethodArgumentReader(ReadOnlyMemory<byte> memory)
5454
{
5555
_memory = memory;
5656
_memoryOffset = 0;
57-
ClearBits();
57+
_bits = 0;
58+
_bit = null;
5859
}
5960

6061
private readonly ReadOnlyMemory<byte> _memory;

projects/client/RabbitMQ.Client/src/client/impl/MethodArgumentWriter.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,21 @@
4444

4545
namespace RabbitMQ.Client.Impl
4646
{
47-
class MethodArgumentWriter
47+
struct MethodArgumentWriter
4848
{
4949
private byte _bitAccumulator;
5050
private int _bitMask;
5151
private bool _needBitFlush;
52-
public int Offset { get; private set; } = 0;
52+
public int Offset { get; private set; }
5353
public Memory<byte> Memory { get; private set; }
5454

5555
public MethodArgumentWriter(Memory<byte> memory)
5656
{
5757
Memory = memory;
58-
ResetBitAccumulator();
58+
_needBitFlush = false;
59+
_bitAccumulator = 0;
60+
_bitMask = 1;
61+
Offset = 0;
5962
}
6063

6164
public void Flush()

projects/client/RabbitMQ.Client/src/client/impl/MethodBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ abstract class MethodBase : IMethod
6262
public abstract string ProtocolMethodName { get; }
6363

6464
public abstract void AppendArgumentDebugStringTo(StringBuilder stringBuilder);
65-
public abstract void ReadArgumentsFrom(MethodArgumentReader reader);
66-
public abstract void WriteArgumentsTo(MethodArgumentWriter writer);
65+
public abstract void ReadArgumentsFrom(ref MethodArgumentReader reader);
66+
public abstract void WriteArgumentsTo(ref MethodArgumentWriter writer);
6767
public abstract int GetRequiredBufferSize();
6868
}
6969
}

projects/client/Unit/src/unit/TestBasicProperties.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,12 @@ public void TestNullableProperties_CanWrite(
106106
Assert.AreEqual(isMessageIdPresent, subject.IsMessageIdPresent());
107107

108108
var writer = new Impl.ContentHeaderPropertyWriter(new byte[1024]);
109-
subject.WritePropertiesTo(writer);
109+
subject.WritePropertiesTo(ref writer);
110110

111111
// Read from Stream
112112
var propertiesFromStream = new Framing.BasicProperties();
113113
var reader = new Impl.ContentHeaderPropertyReader(writer.Memory.Slice(0, writer.Offset));
114-
propertiesFromStream.ReadPropertiesFrom(reader);
114+
propertiesFromStream.ReadPropertiesFrom(ref reader);
115115

116116
Assert.AreEqual(clusterId, propertiesFromStream.ClusterId);
117117
Assert.AreEqual(correlationId, propertiesFromStream.CorrelationId);

0 commit comments

Comments
 (0)