Skip to content

Commit 4b87846

Browse files
authored
Disable Nagle algorithm for reduced latency (#9)
* Disable Nagle algorithm for reduced latency * Flush proper stream * Move localhost IP address into constant * Use loopback shortcut
1 parent eb06dbb commit 4b87846

2 files changed

Lines changed: 23 additions & 12 deletions

File tree

SerializersBenchmark/Network/Abstractions/TcpServer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace SerializersBenchmark.Network.Abstractions;
55

66
public abstract class TcpServer(int port) : IServer
77
{
8-
private readonly TcpListener _tcpListener = new(IPAddress.Parse("127.0.0.1"), port);
8+
private readonly TcpListener _tcpListener = new(IPAddress.Loopback, port);
99
private TcpClient _connectedClient;
1010
protected bool TeardownStarted;
1111

@@ -21,6 +21,7 @@ public void Start()
2121
while (true)
2222
{
2323
_connectedClient = await _tcpListener.AcceptTcpClientAsync();
24+
_connectedClient.Client.NoDelay = true; //disable Nagle's algorithm for low latency
2425
await OnClientConnected(_connectedClient);
2526
}
2627
}

SerializersBenchmark/Network/Rabbit.cs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,54 @@
1-
using System.Net.Sockets;
1+
using System.Net;
2+
using System.Net.Sockets;
23
using SerializersBenchmark.Base;
34
using SerializersBenchmark.Network.Abstractions;
45

56
namespace SerializersBenchmark.Network;
67

7-
public sealed class Rabbit(ISerializerTestAsync serializer, int port, bool useBufferedStream = false) : IRabbit, ITcpClient
8+
public sealed class Rabbit : IRabbit, ITcpClient
89
{
9-
private readonly TcpClient _tcpClient = new();
10+
private readonly TcpClient _tcpClient;
1011
private NetworkStream _networkStream;
12+
private readonly ISerializerTestAsync _serializer;
13+
private readonly int _port;
14+
private readonly bool _useBufferedStream;
15+
public Rabbit(ISerializerTestAsync serializer, int port, bool useBufferedStream = false) {
16+
_serializer = serializer;
17+
_port = port;
18+
_useBufferedStream = useBufferedStream;
19+
_tcpClient = new TcpClient();
20+
_tcpClient.Client.NoDelay = true; //disable Nagle's algorithm for low latency
21+
}
1122

12-
public async Task ConnectAsync()
13-
{
14-
await _tcpClient.ConnectAsync("127.0.0.1", port);
23+
public async Task ConnectAsync() {
24+
await _tcpClient.ConnectAsync(IPAddress.Loopback, _port).ConfigureAwait(false);
1525
_networkStream = _tcpClient.GetStream();
1626
}
1727

1828
public async Task SendAsync(object value, int repeatCount)
1929
{
2030
Stream stream = _networkStream;
21-
if (useBufferedStream)
31+
if (_useBufferedStream)
2232
{
2333
stream = new BufferedStream(stream);
2434
}
2535

2636
for (var i = 0; i < repeatCount; i++)
2737
{
28-
await serializer.SerializeAsync(value, stream).ConfigureAwait(false);
38+
await _serializer.SerializeAsync(value, stream).ConfigureAwait(false);
2939
}
3040

31-
await _networkStream.FlushAsync().ConfigureAwait(false);
41+
await stream.FlushAsync().ConfigureAwait(false);
3242
}
3343

3444
public async Task<object> ReceiveAsync(int expectedSize)
3545
{
3646
Stream stream = new LimitedStreamReader(_networkStream, expectedSize);
37-
if (useBufferedStream)
47+
if (_useBufferedStream)
3848
{
3949
stream = new BufferedStream(stream);
4050
}
41-
return await serializer.DeserializeAsync(stream).ConfigureAwait(false);
51+
return await _serializer.DeserializeAsync(stream).ConfigureAwait(false);
4252
}
4353

4454
public void Dispose()

0 commit comments

Comments
 (0)