udt-net icon indicating copy to clipboard operation
udt-net copied to clipboard

poor performance with many small messages

Open BrannonKing opened this issue 8 years ago • 8 comments

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{};
    }

BrannonKing avatar Nov 17 '15 17:11 BrannonKing