commit 1529d47f186fb7c229dae3eedaedddb9ed999ffb parent 2fcba23d00ae45d24469db135d99ba1ce47b3164 Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com> Date: Mon, 29 Jun 2020 13:16:29 +0100 Slightly changed benchmark console output, and workig on fix for rerunning datagram benchmarks (they brick themselves) Diffstat:
14 files changed, 349 insertions(+), 255 deletions(-)
diff --git a/NetSharp/NetSharp.Benchmarks/BenchmarkHelper.cs b/NetSharp/NetSharp.Benchmarks/BenchmarkHelper.cs @@ -30,8 +30,8 @@ namespace NetSharp.Benchmarks public double CalcBandwidth(long sentPacketCount, long packetSize) { long millis = stopwatch.ElapsedMilliseconds; - double megabytes = sentPacketCount * packetSize / 1_000_000.0; - double bandwidth = megabytes / (millis / 1000.0); + double bytes = sentPacketCount * packetSize; + double bandwidth = (bytes / 1_000_000) / (millis / 1000.0); return bandwidth; } diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedMultiClientRawDatagramBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedMultiClientRawDatagramBenchmark.cs @@ -26,49 +26,62 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks private Task BenchmarkClientTask(object idObj) { - EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + try + { + int id = (int) idObj; - BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - byte[] sendBuffer = new byte[Program.Constants.PacketSize]; - byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; - Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - rawSocket.Bind(Program.Constants.ClientEndPoint); + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; - using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.Bind(Program.Constants.ClientEndPoint); - ServerReadyEvent.Wait(); + using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); - benchmarkHelper.ResetStopwatch(); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } - for (int i = 0; i < Program.Constants.PacketCount; i++) - { - byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); - packetBuffer.CopyTo(sendBuffer, 0); + benchmarkHelper.ResetStopwatch(); - benchmarkHelper.StartStopwatch(); - int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + ServerReadyEvent.Wait(); - int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); - benchmarkHelper.StopStopwatch(); + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); - benchmarkHelper.SnapshotRttStats(); - } + benchmarkHelper.StartStopwatch(); + int sendResult = writer.Write(remoteEndPoint, sendBuffer); - lock (typeof(Console)) - { - benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); - benchmarkHelper.PrintRttStats((int) idObj); - } + int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); + benchmarkHelper.StopStopwatch(); - ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.SnapshotRttStats(); + } - rawSocket.Close(); - rawSocket.Dispose(); + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats(id); + } + + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + rawSocket.Close(); + rawSocket.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } return Task.CompletedTask; } diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedSingleClientRawDatagramBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedSingleClientRawDatagramBenchmark.cs @@ -26,49 +26,62 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks private Task BenchmarkClientTask(object idObj) { - EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + try + { + int id = (int) idObj; - BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - byte[] sendBuffer = new byte[Program.Constants.PacketSize]; - byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; - Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - rawSocket.Bind(Program.Constants.ClientEndPoint); + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; - using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.Bind(Program.Constants.ClientEndPoint); - ServerReadyEvent.Wait(); + using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); - benchmarkHelper.ResetStopwatch(); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } - for (int i = 0; i < Program.Constants.PacketCount; i++) - { - byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); - packetBuffer.CopyTo(sendBuffer, 0); + benchmarkHelper.ResetStopwatch(); - benchmarkHelper.StartStopwatch(); - int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + ServerReadyEvent.Wait(); - int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); - benchmarkHelper.StopStopwatch(); + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); - benchmarkHelper.SnapshotRttStats(); - } + benchmarkHelper.StartStopwatch(); + int sendResult = writer.Write(remoteEndPoint, sendBuffer); - lock (typeof(Console)) - { - benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); - benchmarkHelper.PrintRttStats((int) idObj); - } + int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); + benchmarkHelper.StopStopwatch(); - ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.SnapshotRttStats(); + } - rawSocket.Close(); - rawSocket.Dispose(); + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats(id); + } + + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + rawSocket.Close(); + rawSocket.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } return Task.CompletedTask; } diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderMultiClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderMultiClientBenchmark.cs @@ -27,51 +27,57 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks private Task BenchmarkClientTask(object idObj) { - int id = (int) idObj; + try + { + int id = (int) idObj; - BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[Program.Constants.PacketSize]; - byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; - EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; - using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - clientSocket.Bind(Program.Constants.ClientEndPoint); + using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + clientSocket.Bind(Program.Constants.ClientEndPoint); - lock (typeof(Console)) - { - Console.WriteLine($"[Client {id}] Starting client; sending messages to {remoteEndPoint}"); - } + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client at {clientSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } - benchmarkHelper.ResetStopwatch(); + benchmarkHelper.ResetStopwatch(); - ServerReadyEvent.Wait(); + ServerReadyEvent.Wait(); - for (int i = 0; i < Program.Constants.PacketCount; i++) - { - byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); - packetBuffer.CopyTo(sendBuffer, 0); + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); - benchmarkHelper.StartStopwatch(); - int sentBytes = clientSocket.SendTo(sendBuffer, remoteEndPoint); + benchmarkHelper.StartStopwatch(); + int sentBytes = clientSocket.SendTo(sendBuffer, remoteEndPoint); - int receivedBytes = clientSocket.ReceiveFrom(receiveBuffer, ref remoteEndPoint); - benchmarkHelper.StopStopwatch(); + int receivedBytes = clientSocket.ReceiveFrom(receiveBuffer, ref remoteEndPoint); + benchmarkHelper.StopStopwatch(); - benchmarkHelper.SnapshotRttStats(); - } + benchmarkHelper.SnapshotRttStats(); + } - lock (typeof(Console)) - { - benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); - benchmarkHelper.PrintRttStats(id); - } + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats(id); + } - ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); - clientSocket.Close(); + clientSocket.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } return Task.CompletedTask; } diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderSingleClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderSingleClientBenchmark.cs @@ -27,51 +27,57 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks private Task BenchmarkClientTask(object idObj) { - int id = (int) idObj; + try + { + int id = (int) idObj; - BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[Program.Constants.PacketSize]; - byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; - EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; - using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - clientSocket.Bind(Program.Constants.ClientEndPoint); + using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + clientSocket.Bind(Program.Constants.ClientEndPoint); - lock (typeof(Console)) - { - Console.WriteLine($"[Client {id}] Starting client; sending messages to {remoteEndPoint}"); - } + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client at {clientSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } - benchmarkHelper.ResetStopwatch(); + benchmarkHelper.ResetStopwatch(); - ServerReadyEvent.Wait(); + ServerReadyEvent.Wait(); - for (int i = 0; i < Program.Constants.PacketCount; i++) - { - byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); - packetBuffer.CopyTo(sendBuffer, 0); + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); - benchmarkHelper.StartStopwatch(); - int sentBytes = clientSocket.SendTo(sendBuffer, remoteEndPoint); + benchmarkHelper.StartStopwatch(); + int sentBytes = clientSocket.SendTo(sendBuffer, remoteEndPoint); - int receivedBytes = clientSocket.ReceiveFrom(receiveBuffer, ref remoteEndPoint); - benchmarkHelper.StopStopwatch(); + int receivedBytes = clientSocket.ReceiveFrom(receiveBuffer, ref remoteEndPoint); + benchmarkHelper.StopStopwatch(); - benchmarkHelper.SnapshotRttStats(); - } + benchmarkHelper.SnapshotRttStats(); + } - lock (typeof(Console)) - { - benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); - benchmarkHelper.PrintRttStats(id); - } + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats(id); + } - ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); - clientSocket.Close(); + clientSocket.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } return Task.CompletedTask; } diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterAsyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterAsyncBenchmark.cs @@ -17,24 +17,31 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks private static Task ServerTask(CancellationToken cancellationToken) { - using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - server.Bind(Program.Constants.ServerEndPoint); + try + { + using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + server.Bind(Program.Constants.ServerEndPoint); - byte[] transmissionBuffer = new byte[Program.Constants.PacketSize]; + byte[] transmissionBuffer = new byte[Program.Constants.PacketSize]; - EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - ServerReadyEvent.Set(); + ServerReadyEvent.Set(); - while (!cancellationToken.IsCancellationRequested) - { - server.ReceiveFrom(transmissionBuffer, ref remoteEndPoint); + while (!cancellationToken.IsCancellationRequested) + { + server.ReceiveFrom(transmissionBuffer, ref remoteEndPoint); - server.SendTo(transmissionBuffer, remoteEndPoint); - } + server.SendTo(transmissionBuffer, remoteEndPoint); + } - server.Close(); + server.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } return Task.CompletedTask; } @@ -54,8 +61,9 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks byte[] sendBuffer = new byte[Program.Constants.PacketSize]; byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); @@ -63,6 +71,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {0}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } + benchmarkHelper.ResetStopwatch(); ServerReadyEvent.Wait(); @@ -73,9 +86,9 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks packetBuffer.CopyTo(sendBuffer, 0); benchmarkHelper.StartStopwatch(); - int sendResult = await writer.WriteAsync(Program.Constants.ServerEndPoint, sendBuffer); + int sendResult = await writer.WriteAsync(remoteEndPoint, sendBuffer); - int receiveResult = await writer.ReadAsync(Program.Constants.ServerEndPoint, receiveBuffer); + int receiveResult = await writer.ReadAsync(remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); benchmarkHelper.SnapshotRttStats(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterSyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterSyncBenchmark.cs @@ -17,24 +17,31 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks private static Task ServerTask(CancellationToken cancellationToken) { - using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - server.Bind(Program.Constants.ServerEndPoint); + try + { + using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + server.Bind(Program.Constants.ServerEndPoint); - byte[] transmissionBuffer = new byte[Program.Constants.PacketSize]; + byte[] transmissionBuffer = new byte[Program.Constants.PacketSize]; - EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - ServerReadyEvent.Set(); + ServerReadyEvent.Set(); - while (!cancellationToken.IsCancellationRequested) - { - int received = server.ReceiveFrom(transmissionBuffer, ref remoteEndPoint); + while (!cancellationToken.IsCancellationRequested) + { + int received = server.ReceiveFrom(transmissionBuffer, ref remoteEndPoint); - int sent = server.SendTo(transmissionBuffer, remoteEndPoint); - } + int sent = server.SendTo(transmissionBuffer, remoteEndPoint); + } - server.Close(); + server.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } return Task.CompletedTask; } @@ -57,7 +64,6 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); @@ -65,17 +71,22 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); - ServerReadyEvent.Wait(); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {0}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); benchmarkHelper.StartStopwatch(); - int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + int sendResult = writer.Write(remoteEndPoint, sendBuffer); int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedMultiClientRawStreamBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedMultiClientRawStreamBenchmark.cs @@ -26,6 +26,8 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks private Task BenchmarkClientTask(object idObj) { + int id = (int) idObj; + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); @@ -36,23 +38,27 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); - ServerReadyEvent.Wait(); - rawSocket.Connect(Program.Constants.ServerEndPoint); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + rawSocket.Connect(Program.Constants.ServerEndPoint); + for (int i = 0; i < Program.Constants.PacketCount; i++) { - byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); benchmarkHelper.StartStopwatch(); - int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + int sendResult = writer.Write(remoteEndPoint, sendBuffer); int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); @@ -62,11 +68,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks lock (typeof(Console)) { - benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); - benchmarkHelper.PrintRttStats((int) idObj); + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats(id); } - ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); rawSocket.Shutdown(SocketShutdown.Both); rawSocket.Disconnect(false); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedSingleClientRawStreamBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedSingleClientRawStreamBenchmark.cs @@ -25,6 +25,8 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks private Task BenchmarkClientTask(object idObj) { + int id = (int) idObj; + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); @@ -35,23 +37,27 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); - ServerReadyEvent.Wait(); - rawSocket.Connect(Program.Constants.ServerEndPoint); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + rawSocket.Connect(Program.Constants.ServerEndPoint); + for (int i = 0; i < Program.Constants.PacketCount; i++) { - byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); benchmarkHelper.StartStopwatch(); - int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + int sendResult = writer.Write(remoteEndPoint, sendBuffer); int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); @@ -61,11 +67,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks lock (typeof(Console)) { - benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); - benchmarkHelper.PrintRttStats((int) idObj); + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats(id); } - ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); rawSocket.Shutdown(SocketShutdown.Both); rawSocket.Disconnect(false); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderMultiClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderMultiClientBenchmark.cs @@ -38,19 +38,18 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); clientSocket.Bind(Program.Constants.ClientEndPoint); - ServerReadyEvent.Wait(); - clientSocket.Connect(Program.Constants.ServerEndPoint); - lock (typeof(Console)) { - Console.WriteLine($"[Client {id}] Starting client; sending messages to {remoteEndPoint}"); + Console.WriteLine($"[Client {id}] Starting client at {clientSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + clientSocket.Connect(Program.Constants.ServerEndPoint); + for (int i = 0; i < Program.Constants.PacketCount; i++) { Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})").CopyTo(packetBuffer, 0); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderSingleClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderSingleClientBenchmark.cs @@ -37,19 +37,18 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); clientSocket.Bind(Program.Constants.ClientEndPoint); - ServerReadyEvent.Wait(); - clientSocket.Connect(Program.Constants.ServerEndPoint); - lock (typeof(Console)) { - Console.WriteLine($"[Client {id}] Starting client; sending messages to {remoteEndPoint}"); + Console.WriteLine($"[Client {id}] Starting client at {clientSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + clientSocket.Connect(Program.Constants.ServerEndPoint); + for (int i = 0; i < Program.Constants.PacketCount; i++) { Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})").CopyTo(packetBuffer, 0); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterAsyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterAsyncBenchmark.cs @@ -17,48 +17,54 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks private static Task ServerTask(CancellationToken cancellationToken) { - using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - server.Bind(Program.Constants.ServerEndPoint); - - RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); - byte[] transmissionBuffer = new byte[RawStreamPacket.TotalPacketSize(in archetypalHeader)]; + try + { + using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + server.Bind(Program.Constants.ServerEndPoint); - server.Listen(1); + RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); + byte[] transmissionBuffer = new byte[RawStreamPacket.TotalPacketSize(in archetypalHeader)]; - ServerReadyEvent.Set(); + server.Listen(1); - Socket clientSocket = server.Accept(); + ServerReadyEvent.Set(); - while (!cancellationToken.IsCancellationRequested) - { - int expectedBytes = transmissionBuffer.Length; - - int receivedBytes = 0; - do - { - receivedBytes += clientSocket.Receive(transmissionBuffer, receivedBytes, expectedBytes - receivedBytes, SocketFlags.None); - } while (receivedBytes != 0 && receivedBytes < expectedBytes); + Socket clientSocket = server.Accept(); - if (receivedBytes == 0) + while (!cancellationToken.IsCancellationRequested) { - break; + int expectedBytes = transmissionBuffer.Length; + + int receivedBytes = 0; + do + { + receivedBytes += clientSocket.Receive(transmissionBuffer, receivedBytes, expectedBytes - receivedBytes, SocketFlags.None); + } while (receivedBytes != 0 && receivedBytes < expectedBytes); + + if (receivedBytes == 0) + { + break; + } + + int sentBytes = 0; + do + { + sentBytes += clientSocket.Send(transmissionBuffer, sentBytes, expectedBytes - sentBytes, SocketFlags.None); + } while (sentBytes != 0 && sentBytes < expectedBytes); + + if (sentBytes == 0) + { + break; + } } - int sentBytes = 0; - do - { - sentBytes += clientSocket.Send(transmissionBuffer, sentBytes, expectedBytes - sentBytes, SocketFlags.None); - } while (sentBytes != 0 && sentBytes < expectedBytes); - - if (sentBytes == 0) - { - break; - } + server.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex); } - - server.Shutdown(SocketShutdown.Both); - server.Close(); return Task.CompletedTask; } @@ -78,8 +84,9 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks byte[] sendBuffer = new byte[Program.Constants.PacketSize]; byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); @@ -87,20 +94,25 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); - ServerReadyEvent.Wait(); - rawSocket.Connect(Program.Constants.ServerEndPoint); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {0}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + rawSocket.Connect(Program.Constants.ServerEndPoint); + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); benchmarkHelper.StartStopwatch(); - int sendResult = await writer.WriteAsync(Program.Constants.ServerEndPoint, sendBuffer); + int sendResult = await writer.WriteAsync(remoteEndPoint, sendBuffer); - int receiveResult = await writer.ReadAsync(Program.Constants.ServerEndPoint, receiveBuffer); + int receiveResult = await writer.ReadAsync(remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); benchmarkHelper.SnapshotRttStats(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterSyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterSyncBenchmark.cs @@ -17,49 +17,55 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks private static Task ServerTask(CancellationToken cancellationToken) { - using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - server.Bind(Program.Constants.ServerEndPoint); - - // all the headers should have the same packet size, so will fit in the transmission buffer - RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); - byte[] transmissionBuffer = new byte[RawStreamPacket.TotalPacketSize(in archetypalHeader)]; + try + { + using Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + server.Bind(Program.Constants.ServerEndPoint); - server.Listen(1); + // all the headers should have the same packet size, so will fit in the transmission buffer + RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); + byte[] transmissionBuffer = new byte[RawStreamPacket.TotalPacketSize(in archetypalHeader)]; - ServerReadyEvent.Set(); + server.Listen(1); - Socket clientSocket = server.Accept(); + ServerReadyEvent.Set(); - while (!cancellationToken.IsCancellationRequested) - { - int expectedBytes = transmissionBuffer.Length; - - int receivedBytes = 0; - do - { - receivedBytes += clientSocket.Receive(transmissionBuffer, receivedBytes, expectedBytes - receivedBytes, SocketFlags.None); - } while (receivedBytes < expectedBytes && receivedBytes > 0); + Socket clientSocket = server.Accept(); - if (receivedBytes == 0) + while (!cancellationToken.IsCancellationRequested) { - break; + int expectedBytes = transmissionBuffer.Length; + + int receivedBytes = 0; + do + { + receivedBytes += clientSocket.Receive(transmissionBuffer, receivedBytes, expectedBytes - receivedBytes, SocketFlags.None); + } while (receivedBytes < expectedBytes && receivedBytes > 0); + + if (receivedBytes == 0) + { + break; + } + + int sentBytes = 0; + do + { + sentBytes += clientSocket.Send(transmissionBuffer, sentBytes, expectedBytes - sentBytes, SocketFlags.None); + } while (sentBytes < expectedBytes && sentBytes > 0); + + if (sentBytes == 0) + { + break; + } } - int sentBytes = 0; - do - { - sentBytes += clientSocket.Send(transmissionBuffer, sentBytes, expectedBytes - sentBytes, SocketFlags.None); - } while (sentBytes < expectedBytes && sentBytes > 0); - - if (sentBytes == 0) - { - break; - } + server.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex); } - - server.Shutdown(SocketShutdown.Both); - server.Close(); return Task.CompletedTask; } @@ -82,7 +88,6 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); @@ -90,18 +95,23 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); - ServerReadyEvent.Wait(); - rawSocket.Connect(Program.Constants.ServerEndPoint); + lock (typeof(Console)) + { + Console.WriteLine($"[Client {0}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); + } benchmarkHelper.ResetStopwatch(); + ServerReadyEvent.Wait(); + rawSocket.Connect(Program.Constants.ServerEndPoint); + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); benchmarkHelper.StartStopwatch(); - int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + int sendResult = writer.Write(remoteEndPoint, sendBuffer); int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); diff --git a/NetSharp/NetSharp.Benchmarks/Program.cs b/NetSharp/NetSharp.Benchmarks/Program.cs @@ -115,7 +115,7 @@ namespace NetSharp.Benchmarks private const int DefaultExamplePort = 44231; private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; - public const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 8; + public const int PacketSize = 8192, PacketCount = 100_000, ClientCount = 8; public static readonly EndPoint ClientEndPoint = new IPEndPoint(DefaultExampleAddress, 0); public static readonly Encoding ServerEncoding = Encoding.UTF8;