Performance tuning PulsarStream (#103)
Use ReadAtLeast to wait until a usable amount of data is ready.
diff --git a/src/DotPulsar/Internal/PulsarStream.cs b/src/DotPulsar/Internal/PulsarStream.cs
index cbf3104..7c6fbe0 100644
--- a/src/DotPulsar/Internal/PulsarStream.cs
+++ b/src/DotPulsar/Internal/PulsarStream.cs
@@ -117,9 +117,11 @@
try
{
+ uint? frameSize = null;
while (true)
{
- var result = await _reader.ReadAsync(cancellationToken).ConfigureAwait(false);
+ var minimumSize = frameSize.HasValue ? (int) frameSize.Value + 4 : 4;
+ var result = await _reader.ReadAtLeastAsync(minimumSize, cancellationToken).ConfigureAwait(false);
var buffer = result.Buffer;
while (true)
@@ -127,15 +129,16 @@
if (buffer.Length < 4)
break;
- var frameSize = buffer.ReadUInt32(0, true);
- var totalSize = frameSize + 4;
+ frameSize ??= buffer.ReadUInt32(0, true);
+ var totalSize = frameSize.Value + 4;
if (buffer.Length < totalSize)
break;
- yield return buffer.Slice(4, frameSize);
+ yield return buffer.Slice(4, frameSize.Value);
buffer = buffer.Slice(totalSize);
+ frameSize = null;
}
if (result.IsCompleted)