udt-net
udt-net copied to clipboard
poor performance with many small messages
I've been testing a variety of communications packages. This udt-net package is actually my worst performer. It takes 22 seconds to round-trip 1000 small messages. That's about 20x longer than the websocket frameworks I've been testing. I show 3ms of latency for sending a message from the server to the client -- about 100x worse than WebSocketSharp. Is there some flag/setting that I'm missing? Here is some of my code:
// creation for client and server are similar:
var listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram);
listener.Bind(IPAddress.Loopback, port);
listener.Listen(100);
// and my message handler:
public class UdtSocketTransportSource : ITransportSource
{
private readonly Socket _socket;
public UdtSocketTransportSource(Socket socket, bool isServer)
{
_socket = socket;
if (isServer)
{
StartAcceptingConnections(socket);
}
else
StartReceivingMessages(socket, new byte[socket.ReceiveBufferSize]);
}
private void StartAcceptingConnections(Socket socket)
{
var task = new Task(() =>
{
while (!socket.IsDisposed)
{
var connection = socket.Accept();
if (connection != null)
StartReceivingMessages(connection, new byte[socket.ReceiveBufferSize]);
}
}, TaskCreationOptions.LongRunning);
task.Start();
}
private void StartReceivingMessages(Socket socket, byte[] buffer)
{
var task = new Task(() =>
{
while (!socket.IsDisposed)
{
var received = socket.ReceiveMessage(buffer);
if (received >= 0)
{
var args = new DataReceivedArgs
{
Data = new ArraySegment<byte>(buffer, 0, received),
SessionID = socket
};
Received.Invoke(this, args);
}
}
}, TaskCreationOptions.LongRunning);
task.Start();
}
public Task Send(ArraySegment<byte> data, params object[] sessionIDs)
{
if (sessionIDs == null || sessionIDs.Length <= 0)
_socket.SendMessage(data.Array, data.Offset, data.Count);
else
{
for (int i = 0; i < sessionIDs.Length; i++)
{
var socket = sessionIDs[i] == null ? _socket : (Socket)sessionIDs[i];
socket.SendMessage(data.Array, data.Offset, data.Count);
}
}
return Task.FromResult(true);
}
public event EventHandler<DataReceivedArgs> Received = delegate{};
}