Skip to content

Commit 30486b0

Browse files
authored
Use array pooling to reduce GC pressure in the deserialization hot path (#2497)
1 parent 0f1fa61 commit 30486b0

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

src/Confluent.Kafka/Confluent.Kafka.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net462'">
3434
<PackageReference Include="System.Memory" Version="4.5.0" />
35+
<PackageReference Include="System.Buffers" Version="4.6.1" />
3536
</ItemGroup>
3637

3738
<ItemGroup>

src/Confluent.Kafka/SyncOverAsyncDeserializer.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Buffers;
23

34
namespace Confluent.Kafka.SyncOverAsync
45
{
@@ -72,9 +73,22 @@ public SyncOverAsyncDeserializer(IAsyncDeserializer<T> asyncDeserializer)
7273
/// The deserialized value.
7374
/// </returns>
7475
public T Deserialize(ReadOnlySpan<byte> data, bool isNull, SerializationContext context)
75-
=> asyncDeserializer.DeserializeAsync(new ReadOnlyMemory<byte>(data.ToArray()), isNull, context)
76+
{
77+
var rentedBuffer = ArrayPool<byte>.Shared.Rent(data.Length);
78+
data.CopyTo(rentedBuffer);
79+
80+
var memorySegment = new ReadOnlyMemory<byte>(rentedBuffer, 0, data.Length);
81+
try
82+
{
83+
return asyncDeserializer.DeserializeAsync(memorySegment, isNull, context)
7684
.GetAwaiter()
7785
.GetResult();
86+
}
87+
finally
88+
{
89+
ArrayPool<byte>.Shared.Return(rentedBuffer);
90+
}
91+
}
7892
}
7993

8094
/// <summary>

0 commit comments

Comments
 (0)