Skip to content

Commit a716ea2

Browse files
committed
Merge pull request #158 from unsafePtr/feat/optimize-for-reading-messages
2 parents 10f39cf + 5a970e4 commit a716ea2

1 file changed

Lines changed: 12 additions & 12 deletions

File tree

src/Websocket.Client/WebsocketClient.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.Extensions.Logging.Abstractions;
33
using Microsoft.IO;
44
using System;
5+
using System.Buffers;
56
using System.IO;
67
using System.Net.WebSockets;
78
using System.Reactive.Linq;
@@ -483,30 +484,29 @@ private async Task Listen(WebSocket client, CancellationToken token)
483484
{
484485
// define buffer here and reuse, to avoid more allocation
485486
const int chunkSize = 1024 * 4;
486-
var buffer = new Memory<byte>(new byte[chunkSize]);
487+
// allocate bigger buffer (16kb) to avoid resizing in case of big messages
488+
var arrayBufferWriter = new ArrayBufferWriter<byte>(chunkSize * 4);
487489

488490
do
489491
{
490492
ValueWebSocketReceiveResult result;
491-
var ms = MemoryStreamManager.GetStream();
492493

493494
while (true)
494495
{
496+
var buffer = arrayBufferWriter.GetMemory(chunkSize);
495497
result = await client.ReceiveAsync(buffer, token);
496-
ms.Write(buffer[..result.Count].Span);
498+
499+
arrayBufferWriter.Advance(result.Count);
497500

498501
if (result.EndOfMessage)
499502
break;
500503
}
501504

502-
ms.Seek(0, SeekOrigin.Begin);
503-
504505
ResponseMessage message;
505-
bool shouldDisposeStream = true;
506506

507507
if (result.MessageType == WebSocketMessageType.Text && IsTextMessageConversionEnabled)
508508
{
509-
var data = GetEncoding().GetString(ms.GetBuffer(), 0, (int)ms.Length);
509+
var data = GetEncoding().GetString(arrayBufferWriter.WrittenSpan);
510510
message = ResponseMessage.TextMessage(data);
511511
}
512512
else if (result.MessageType == WebSocketMessageType.Close)
@@ -546,17 +546,17 @@ private async Task Listen(WebSocket client, CancellationToken token)
546546
{
547547
if (IsStreamDisposedAutomatically)
548548
{
549-
message = ResponseMessage.BinaryMessage(ms.ToArray());
549+
message = ResponseMessage.BinaryMessage(arrayBufferWriter.WrittenSpan.ToArray());
550550
}
551551
else
552552
{
553-
message = ResponseMessage.BinaryStreamMessage(ms);
554-
shouldDisposeStream = false;
553+
var stream = MemoryStreamManager.GetStream(arrayBufferWriter.WrittenSpan);
554+
message = ResponseMessage.BinaryStreamMessage(stream);
555555
}
556556
}
557557

558-
if (shouldDisposeStream)
559-
ms.Dispose();
558+
// clear buffer for next message
559+
arrayBufferWriter.Clear();
560560

561561
_logger.LogTrace(L("Received: {message}"), Name, message);
562562
_lastReceivedMsg = DateTime.UtcNow;

0 commit comments

Comments
 (0)