From 3ddbc1ede3dc7904f027437e53d0c483c666060f Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 16 Jan 2018 07:57:57 +0500
Subject: [PATCH 001/159] Unification of variables for ENet
---
BenchmarkNet.cs | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index c7b2e60..3f08ccb 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -350,30 +350,30 @@ public static void Server() {
using (Host server = new Host()) {
server.Create(port, maxClients);
- Event serverEvent = new Event();
+ Event netEvent = new Event();
while (processActive) {
- server.Service(1000 / serverTickRate, out serverEvent);
+ server.Service(1000 / serverTickRate, out netEvent);
- switch (serverEvent.Type) {
+ switch (netEvent.Type) {
case EventType.Receive:
- byte[] data = serverEvent.Packet.GetBytes();
+ byte[] data = netEvent.Packet.GetBytes();
- if (serverEvent.ChannelID == 2) {
+ if (netEvent.ChannelID == 2) {
Interlocked.Increment(ref serverReliableReceived);
- SendReliable(messageData, 0, serverEvent.Peer);
+ SendReliable(messageData, 0, netEvent.Peer);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
Interlocked.Add(ref serverReliableBytesReceived, data.Length);
- } else if (serverEvent.ChannelID == 3) {
+ } else if (netEvent.ChannelID == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
- SendUnreliable(messageData, 1, serverEvent.Peer);
+ SendUnreliable(messageData, 1, netEvent.Peer);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
}
- serverEvent.Packet.Dispose();
+ netEvent.Packet.Dispose();
break;
}
@@ -393,7 +393,7 @@ await Task.Factory.StartNew(() => {
address.Port = port;
Peer peer = client.Connect(address, 4, 0);
- Event clientEvent = new Event();
+ Event netEvent = new Event();
int reliableToSend = 0;
int unreliableToSend = 0;
@@ -423,9 +423,9 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.LongRunning);
while (processActive) {
- client.Service(1000 / clientTickRate, out clientEvent);
+ client.Service(1000 / clientTickRate, out netEvent);
- switch (clientEvent.Type) {
+ switch (netEvent.Type) {
case EventType.Connect:
Interlocked.Increment(ref clientsConnectedCount);
Interlocked.Exchange(ref reliableToSend, reliableMessages);
@@ -439,17 +439,17 @@ await Task.Factory.StartNew(() => {
break;
case EventType.Receive:
- byte[] data = clientEvent.Packet.GetBytes();
+ byte[] data = netEvent.Packet.GetBytes();
- if (clientEvent.ChannelID == 0) {
+ if (netEvent.ChannelID == 0) {
Interlocked.Increment(ref clientsReliableReceived);
Interlocked.Add(ref clientsReliableBytesReceived, data.Length);
- } else if (clientEvent.ChannelID == 1) {
+ } else if (netEvent.ChannelID == 1) {
Interlocked.Increment(ref clientsUnreliableReceived);
Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
}
- clientEvent.Packet.Dispose();
+ netEvent.Packet.Dispose();
break;
}
From d7f10a79b4bd4b98907d716c41846bfb7a720f3f Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 17 Jan 2018 03:15:45 +0500
Subject: [PATCH 002/159] Add a new function to override text in the console
window
---
BenchmarkNet.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 3f08ccb..df5ef0e 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -93,6 +93,8 @@ public class BenchmarkNet {
"Hazel"
};
+ private static Func Space = (v) => ("".PadRight(v));
+
private static void Main() {
Console.Title = title;
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
@@ -236,7 +238,7 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
- Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted && serverThread.IsAlive ? "Completed" : (serverThread.IsAlive ? "Running" : "Failure"))));
+ Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted && serverThread.IsAlive ? "Completed" : (serverThread.IsAlive ? "Running" + Space(2) : "Failure" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
From c61e5269aade3da7d2846673cade4b1ac17d163a Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 17 Jan 2018 04:07:39 +0500
Subject: [PATCH 003/159] Minor changes
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index df5ef0e..95d1ecb 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -93,7 +93,7 @@ public class BenchmarkNet {
"Hazel"
};
- private static Func Space = (v) => ("".PadRight(v));
+ private static Func Space = (value) => ("".PadRight(value));
private static void Main() {
Console.Title = title;
@@ -186,7 +186,7 @@ private static void Main() {
Library.Initialize();
maxPeers = ushort.MaxValue;
- maxClientsPass = (selectedNetworkingLibrary > 0 ? maxClients <= maxPeers : maxClients <= Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
+ maxClientsPass = (selectedNetworkingLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
if (!maxClientsPass)
maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedNetworkingLibrary > 0 ? maxPeers : (ushort)Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
From e1e06f7ad6f9c7a419c9438e5559ebc303c34622 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 17 Jan 2018 06:37:06 +0500
Subject: [PATCH 004/159] Minor change for Hazel server
---
BenchmarkNet.cs | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 95d1ecb..b03442e 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -958,15 +958,13 @@ public static void Server() {
netEvent.Connection.DataReceived += (sender, data) => {
if (data.SendOption == SendOption.Reliable) {
Interlocked.Increment(ref serverReliableReceived);
- Connection senderConnection = (Connection)sender;
- senderConnection.SendBytes(messageData, SendOption.Reliable);
+ ((Connection)sender).SendBytes(messageData, SendOption.Reliable);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
Interlocked.Add(ref serverReliableBytesReceived, data.Bytes.Length);
} else if (data.SendOption == SendOption.None) {
Interlocked.Increment(ref serverUnreliableReceived);
- Connection senderConnection = (Connection)sender;
- senderConnection.SendBytes(messageData, SendOption.None);
+ ((Connection)sender).SendBytes(messageData, SendOption.None);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
Interlocked.Add(ref serverUnreliableBytesReceived, data.Bytes.Length);
From 97ad2e477399cc949f47b55d150de0914ee71d11 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 18 Jan 2018 00:58:06 +0500
Subject: [PATCH 005/159] Update README.md
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index 053fd5f..f14baf8 100644
--- a/README.md
+++ b/README.md
@@ -32,3 +32,7 @@ Discussion
You can find the latest benchmark results in the [thread](https://forum.unity.com/threads/benchmarknet-stress-test-for-enet-unet-litenetlib-lidgren-and-miniudp.512507 "thread") on Unity forums.
If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "email").
+
+Donations
+--------
+If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal"). Any support is much appreciated.
From 9ae2fc06adc8e75305677a686819bd778847755f Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 18 Jan 2018 01:32:24 +0500
Subject: [PATCH 006/159] Update README.md
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f14baf8..612c814 100644
--- a/README.md
+++ b/README.md
@@ -35,4 +35,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal"). Any support is much appreciated.
+If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal").
+
+Any support is much appreciated.
From eb957d3b188183afd754de8c71fc1fd9644c1a25 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 18 Jan 2018 02:19:07 +0500
Subject: [PATCH 007/159] Update README.md
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 612c814..aa3d4bb 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,8 @@ Features:
- Simple and flexible simulation setup
- Detailed session information
+You can find the latest benchmark results on the [wiki page](https://github.com/nxrighthere/BenchmarkNet/wiki/Benchmark-Results).
+
How it works?
--------
Each simulated client is one asynchronous task for establishing a connection with the server and processing the network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which works independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
@@ -29,7 +31,7 @@ If you want to simulate a bad network condition, use [Clumsy](http://jagt.github
Discussion
--------
-You can find the latest benchmark results in the [thread](https://forum.unity.com/threads/benchmarknet-stress-test-for-enet-unet-litenetlib-lidgren-and-miniudp.512507 "thread") on Unity forums.
+Feel free to join the discussion in the [thread](https://forum.unity.com/threads/benchmarknet-stress-test-for-enet-unet-litenetlib-lidgren-and-miniudp.512507 "thread") on Unity forums.
If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "email").
From a17cd0b4a0ca4e50d7ea1291f72818fe24366d0e Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 18 Jan 2018 02:31:24 +0500
Subject: [PATCH 008/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index aa3d4bb..10d7c71 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal").
+This project has already had an impact and helped developers in an improvement of their network libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal").
Any support is much appreciated.
From b685291749cf53588b8e7b6e3438a787449fb9ed Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 18 Jan 2018 02:31:55 +0500
Subject: [PATCH 009/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 10d7c71..47efa3a 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their network libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal").
+This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal").
Any support is much appreciated.
From e16a5ea69acd012c00d750c85835ed04546feefa Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 19 Jan 2018 09:24:38 +0500
Subject: [PATCH 010/159] Fix detection of process completion
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index b03442e..453c70f 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -238,7 +238,7 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
- Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted && serverThread.IsAlive ? "Completed" : (serverThread.IsAlive ? "Running" + Space(2) : "Failure" + Space(2)))));
+ Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted ? "Completed" : (serverThread.IsAlive ? "Running" + Space(2) : "Failure" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
From 5fcdbc78f9bb1a7fba4b67d1ce9a6bb9bc4984a6 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 02:35:23 +0500
Subject: [PATCH 011/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 47efa3a..ece5a13 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [PayPal](https://www.paypal.me/nxrighthere "PayPal").
+This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi"), [PayPal](https://www.paypal.me/nxrighthere "PayPal") or [Yandex](https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=nxrighthere&targets-hint=&default-sum=100&button-text=14&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=41001289261209 "Yandex").
Any support is much appreciated.
From 242793e16c78afb9eaffa9e0dff1b3394d198836 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 04:03:34 +0500
Subject: [PATCH 012/159] Add the payload flow measurement
---
BenchmarkNet.cs | 119 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 118 insertions(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 453c70f..7478766 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -47,7 +47,7 @@
namespace BenchmarkNet {
public class BenchmarkNet {
protected const string title = "BenchmarkNet";
- protected const string version = "1.02";
+ protected const string version = "1.03";
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
protected static ushort maxClients = 0;
@@ -65,6 +65,7 @@ public class BenchmarkNet {
protected static Thread serverThread;
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
+ protected static volatile int clientsChannelsCount = 0;
protected static volatile int clientsDisconnectedCount = 0;
protected static volatile int serverReliableSent = 0;
protected static volatile int serverReliableReceived = 0;
@@ -94,6 +95,7 @@ public class BenchmarkNet {
};
private static Func Space = (value) => ("".PadRight(value));
+ private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
private static void Main() {
Console.Title = title;
@@ -240,6 +242,7 @@ await Task.Factory.StartNew(() => {
Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted ? "Completed" : (serverThread.IsAlive ? "Running" + Space(2) : "Failure" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
+ Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)");
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
@@ -403,6 +406,9 @@ await Task.Factory.StartNew(() => {
int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
while (processActive) {
if (reliableToSend > 0) {
SendReliable(messageData, 2, peer);
@@ -420,6 +426,22 @@ await Task.Factory.StartNew(() => {
Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
}
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
await Task.Delay(1000 / sendRate);
}
}, TaskCreationOptions.LongRunning);
@@ -534,6 +556,9 @@ await Task.Factory.StartNew(() => {
int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
while (processActive) {
byte error;
@@ -553,6 +578,22 @@ await Task.Factory.StartNew(() => {
Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
}
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
await Task.Delay(1000 / sendRate);
}
}, TaskCreationOptions.LongRunning);
@@ -662,6 +703,9 @@ await Task.Factory.StartNew(() => {
int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
while (processActive) {
if (reliableToSend > 0) {
SendReliable(messageData, client.GetFirstPeer());
@@ -679,6 +723,22 @@ await Task.Factory.StartNew(() => {
Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
}
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
await Task.Delay(1000 / sendRate);
}
}, TaskCreationOptions.LongRunning);
@@ -783,6 +843,9 @@ await Task.Factory.StartNew(() => {
int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
while (processActive) {
if (reliableToSend > 0) {
SendReliable(messageData, client.ServerConnection, client.CreateMessage(), 2);
@@ -800,6 +863,22 @@ await Task.Factory.StartNew(() => {
Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
}
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
await Task.Delay(1000 / sendRate);
}
}, TaskCreationOptions.LongRunning);
@@ -897,6 +976,9 @@ await Task.Factory.StartNew(() => {
int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
while (processActive) {
if (reliableToSend > 0) {
SendReliable(messageData, connection);
@@ -914,6 +996,22 @@ await Task.Factory.StartNew(() => {
Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
}
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
await Task.Delay(1000 / sendRate);
}
}, TaskCreationOptions.LongRunning);
@@ -995,6 +1093,9 @@ await Task.Factory.StartNew(() => {
int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
while (processActive) {
if (reliableToSend > 0) {
client.SendBytes(messageData, SendOption.Reliable);
@@ -1012,6 +1113,22 @@ await Task.Factory.StartNew(() => {
Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
}
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
await Task.Delay(1000 / sendRate);
}
}, TaskCreationOptions.LongRunning);
From 5b5838d49266a88b40faa841ef217f1e799626ca Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 04:12:36 +0500
Subject: [PATCH 013/159] Minor fix for output text
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7478766..585314e 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -242,7 +242,7 @@ await Task.Factory.StartNew(() => {
Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted ? "Completed" : (serverThread.IsAlive ? "Running" + Space(2) : "Failure" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
- Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)");
+ Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
From 2b4a6f6cf2af1118deb5348f53a81d7b5c6a810d Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 05:00:26 +0500
Subject: [PATCH 014/159] Fix sending data after drop of the client
---
BenchmarkNet.cs | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 585314e..3831167 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -459,6 +459,8 @@ await Task.Factory.StartNew(() => {
case EventType.Disconnect:
Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
break;
@@ -616,6 +618,8 @@ await Task.Factory.StartNew(() => {
case NetworkEventType.DisconnectEvent:
Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
break;
@@ -751,6 +755,8 @@ await Task.Factory.StartNew(() => {
listener.PeerDisconnectedEvent += (peer, info) => {
Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
};
listener.NetworkReceiveEvent += (peer, reader, deliveryMethod) => {
@@ -897,6 +903,8 @@ await Task.Factory.StartNew(() => {
Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
} else if (status == NetConnectionStatus.Disconnected) {
Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
}
break;
@@ -1024,6 +1032,8 @@ await Task.Factory.StartNew(() => {
client.PeerClosed += (peer, reason, kickReason, error) => {
Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
};
client.PeerNotification += (peer, data, dataLength) => {
@@ -1141,6 +1151,8 @@ await Task.Factory.StartNew(() => {
client.Disconnected += (sender, data) => {
Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
};
client.DataReceived += (sender, data) => {
From 00e2ca8af58458683e3751ea5c9236b658b9f301 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 07:23:38 +0500
Subject: [PATCH 015/159] Update README.md
---
README.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ece5a13..dfb5c28 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,9 @@
-# BenchmarkNet [](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
+
+
+
+
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
+
BenchmarkNet is a console application for testing the reliable UDP networking libraries.
Supported networking libraries:
From 68e52715e7b954c3ab41eb4f8f23210f89d733d6 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 07:28:08 +0500
Subject: [PATCH 016/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index dfb5c28..78c55d1 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
From ff5b97dcde4dcc7b0b17d25b420970d46f3b1088 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 20:31:35 +0500
Subject: [PATCH 017/159] Add support for Photon
---
BenchmarkNet.cs | 154 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 151 insertions(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 3831167..234a72c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -26,6 +26,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -43,6 +44,8 @@
// Hazel (https://github.com/DarkRiftNetworking/Hazel-Networking)
using Hazel;
using Hazel.Udp;
+// Photon (https://www.photonengine.com/en/OnPremise)
+using ExitGames.Client.Photon;
namespace BenchmarkNet {
public class BenchmarkNet {
@@ -57,7 +60,9 @@ public class BenchmarkNet {
protected static int reliableMessages = 0;
protected static int unreliableMessages = 0;
protected static string message = "";
+ protected static char[] reversedMessage;
protected static byte[] messageData;
+ protected static byte[] reversedMessageData;
protected static bool processActive = false;
protected static bool processCompleted = false;
protected static bool processOverload = false;
@@ -91,7 +96,8 @@ public class BenchmarkNet {
"LiteNetLib",
"Lidgren",
"MiniUDP",
- "Hazel"
+ "Hazel",
+ "Photon"
};
private static Func Space = (value) => ("".PadRight(value));
@@ -177,7 +183,10 @@ private static void Main() {
if (message == string.Empty)
message = defaultMessage;
+ reversedMessage = message.ToCharArray();
+ Array.Reverse(reversedMessage);
messageData = Encoding.ASCII.GetBytes(message);
+ reversedMessageData = Encoding.ASCII.GetBytes(new string(reversedMessage));
Console.CursorVisible = false;
Console.Clear();
@@ -203,8 +212,10 @@ private static void Main() {
serverThread = new Thread(LidgrenBenchmark.Server);
else if (selectedNetworkingLibrary == 4)
serverThread = new Thread(MiniUDPBenchmark.Server);
- else
+ else if (selectedNetworkingLibrary == 5)
serverThread = new Thread(HazelBenchmark.Server);
+ else
+ serverThread = new Thread(PhotonBenchmark.Server);
serverThread.Start();
Thread.Sleep(100);
@@ -328,8 +339,10 @@ await Task.Factory.StartNew(() => {
clients.Add(LidgrenBenchmark.Client());
else if (selectedNetworkingLibrary == 4)
clients.Add(MiniUDPBenchmark.Client());
- else
+ else if (selectedNetworkingLibrary == 5)
clients.Add(HazelBenchmark.Client());
+ else
+ clients.Add(PhotonBenchmark.Client());
Interlocked.Increment(ref clientsStartedCount);
Thread.Sleep(15);
@@ -1175,4 +1188,139 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.LongRunning);
}
}
+
+ public class PhotonBenchmark : BenchmarkNet {
+ private class PhotonPeerListener : IPhotonPeerListener {
+ public event Action OnConnected;
+ public event Action OnDisconnected;
+ public event Action OnReliableReceived;
+ public event Action OnUnreliableReceived;
+
+ public void OnMessage(object message) {
+ byte[] data = (byte[])message;
+
+ if (data.SequenceEqual(messageData)) {
+ OnReliableReceived?.Invoke(data);
+ Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, data.Length);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Length);
+ } else if (data.SequenceEqual(reversedMessageData)) {
+ OnUnreliableReceived?.Invoke(data);
+ Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, data.Length);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
+ }
+ }
+
+ public void OnStatusChanged(StatusCode statusCode) {
+ switch (statusCode) {
+ case StatusCode.Connect:
+ OnConnected.Invoke();
+
+ break;
+
+ case StatusCode.Disconnect:
+ OnDisconnected.Invoke();
+
+ break;
+ }
+ }
+
+ public void OnEvent(EventData netEvent) { }
+
+ public void OnOperationResponse(OperationResponse operationResponse) { }
+
+ public void DebugReturn(DebugLevel level, string message) { }
+ }
+
+ public static void Server() {
+ Thread.Sleep(Timeout.Infinite);
+ }
+
+ public static async Task Client() {
+ await Task.Factory.StartNew(() => {
+ PhotonPeerListener listener = new PhotonPeerListener();
+ PhotonPeer client = new PhotonPeer(listener, ConnectionProtocol.Udp);
+
+ client.Connect(ip + ":" + port, title);
+
+ int reliableToSend = 0;
+ int unreliableToSend = 0;
+ int reliableSentCount = 0;
+ int unreliableSentCount = 0;
+
+ Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
+ while (processActive) {
+ if (reliableToSend > 0) {
+ client.SendMessage(messageData, true, 0, false);
+ Interlocked.Decrement(ref reliableToSend);
+ Interlocked.Increment(ref reliableSentCount);
+ Interlocked.Increment(ref clientsReliableSent);
+ Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
+ }
+
+ if (unreliableToSend > 0) {
+ client.SendMessage(reversedMessageData, false, 1, false);
+ Interlocked.Decrement(ref unreliableToSend);
+ Interlocked.Increment(ref unreliableSentCount);
+ Interlocked.Increment(ref clientsUnreliableSent);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedMessageData.Length);
+ }
+
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ await Task.Delay(1000 / sendRate);
+ }
+ }, TaskCreationOptions.LongRunning);
+
+ listener.OnConnected += () => {
+ Interlocked.Increment(ref clientsConnectedCount);
+ Interlocked.Exchange(ref reliableToSend, reliableMessages);
+ Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
+ };
+
+ listener.OnDisconnected += () => {
+ Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
+ };
+
+ listener.OnReliableReceived += (data) => {
+ Interlocked.Increment(ref clientsReliableReceived);
+ Interlocked.Add(ref clientsReliableBytesReceived, data.Length);
+ };
+
+ listener.OnUnreliableReceived += (data) => {
+ Interlocked.Increment(ref clientsUnreliableReceived);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
+ };
+
+ while (processActive) {
+ client.Service();
+ Thread.Sleep(1000 / clientTickRate);
+ }
+
+ client.Disconnect();
+ }, TaskCreationOptions.LongRunning);
+ }
+ }
}
From a08287bd24bff51a36aaab48ccec22dcd63855dd Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 20 Jan 2018 20:32:38 +0500
Subject: [PATCH 018/159] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 78c55d1..3f26e97 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,7 @@ Supported networking libraries:
- [Lidgren](https://github.com/lidgren/lidgren-network-gen3 "Lidgren")
- [MiniUDP](https://github.com/ashoulson/MiniUDP "MiniUDP")
- [Hazel](https://github.com/DarkRiftNetworking/Hazel-Networking "Hazel")
+- [Photon](https://www.photonengine.com/en/OnPremise "Photon")
Features:
- Asynchronous simulation of a large number of clients
From 64facfa60ddb6588ff405bc48238fcef1ebf149d Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 21 Jan 2018 06:40:43 +0500
Subject: [PATCH 019/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 3f26e97..fe4cb88 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi"), [PayPal](https://www.paypal.me/nxrighthere "PayPal") or [Yandex](https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=nxrighthere&targets-hint=&default-sum=100&button-text=14&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=41001289261209 "Yandex").
+This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [Yandex](https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=nxrighthere&targets-hint=&default-sum=100&button-text=14&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=41001289261209 "Yandex").
Any support is much appreciated.
From 76447bd20e6ec94459eca768fa186e31c3981527 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 21 Jan 2018 07:55:40 +0500
Subject: [PATCH 020/159] Add connection check for Photon server
---
BenchmarkNet.cs | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 234a72c..be632bc 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -66,6 +66,7 @@ public class BenchmarkNet {
protected static bool processActive = false;
protected static bool processCompleted = false;
protected static bool processOverload = false;
+ protected static bool processFailure = false;
protected static bool maxClientsPass = true;
protected static Thread serverThread;
protected static volatile int clientsStartedCount = 0;
@@ -251,7 +252,7 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
- Console.WriteLine(Environment.NewLine + "Server status: " + (processOverload ? "Overload" : (processCompleted ? "Completed" : (serverThread.IsAlive ? "Running" + Space(2) : "Failure" + Space(2)))));
+ Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" : (processCompleted ? "Completed" : "Running" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
@@ -1236,7 +1237,20 @@ public void DebugReturn(DebugLevel level, string message) { }
}
public static void Server() {
- Thread.Sleep(Timeout.Infinite);
+ PhotonPeerListener listener = new PhotonPeerListener();
+ PhotonPeer server = new PhotonPeer(listener, ConnectionProtocol.Udp);
+
+ server.Connect(ip + ":" + port, title);
+
+ listener.OnConnected += () => {
+ Thread.Sleep(Timeout.Infinite);
+ };
+
+ listener.OnDisconnected += () => {
+ processFailure = true;
+ };
+
+ server.Disconnect();
}
public static async Task Client() {
From b0e2d7a0ede814e822f1de9dbf219bc99c2be0e6 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 21 Jan 2018 07:59:14 +0500
Subject: [PATCH 021/159] Minor fix for output text
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index be632bc..f1c3ffd 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -252,7 +252,7 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
- Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" : (processCompleted ? "Completed" : "Running" + Space(2)))));
+ Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
From dcb731c81d81671ff836b7c5f2ecc4ff81342679 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 21 Jan 2018 08:21:08 +0500
Subject: [PATCH 022/159] Fix instant termination of the thread for Photon
server
---
BenchmarkNet.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f1c3ffd..2be22e6 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1250,6 +1250,11 @@ public static void Server() {
processFailure = true;
};
+ while (processActive) {
+ server.Service();
+ Thread.Sleep(1000 / serverTickRate);
+ }
+
server.Disconnect();
}
From 9101c0e1d98fca444fde265d71a9ae2492597814 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 21 Jan 2018 21:33:41 +0500
Subject: [PATCH 023/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index fe4cb88..ba2a518 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
-BenchmarkNet is a console application for testing the reliable UDP networking libraries.
+BenchmarkNet is a console application for testing the reliable UDP networking solutions.
Supported networking libraries:
- [ENet](https://github.com/lsalzman/enet "ENet") ([C# Wrapper](https://github.com/NateShoffner/ENetSharp "C# Wrapper"))
From 6b5a14ddc42fce8a14d0f5b19d3c5ecddf77bd05 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 21 Jan 2018 21:34:07 +0500
Subject: [PATCH 024/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ba2a518..5bbd3ec 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
-Supported networking libraries:
+Supported networking solutions:
- [ENet](https://github.com/lsalzman/enet "ENet") ([C# Wrapper](https://github.com/NateShoffner/ENetSharp "C# Wrapper"))
- [UNet](https://docs.unity3d.com/Manual/UNetUsingTransport.html "UNet")
- [LiteNetLib](https://github.com/RevenantX/LiteNetLib "LiteNetLib")
From b8491dd2847c4a0875616d03ca7b1dca7351733e Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 10:30:12 +0500
Subject: [PATCH 025/159] Add a comment to OnMessage method for Photon client
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 2be22e6..5a8ac99 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1197,7 +1197,7 @@ private class PhotonPeerListener : IPhotonPeerListener {
public event Action OnReliableReceived;
public event Action OnUnreliableReceived;
- public void OnMessage(object message) {
+ public void OnMessage(object message) { // Photon API doesn't have a native parameter on the client-side to determine the channel number
byte[] data = (byte[])message;
if (data.SequenceEqual(messageData)) {
From 231c51a7f5f5e1b2f4450ec53e2535e94aa90b34 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 12:34:49 +0500
Subject: [PATCH 026/159] Optimize detection of received data for Photon client
---
BenchmarkNet.cs | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 5a8ac99..795c6c2 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -26,7 +26,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
-using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -1197,16 +1196,16 @@ private class PhotonPeerListener : IPhotonPeerListener {
public event Action OnReliableReceived;
public event Action OnUnreliableReceived;
- public void OnMessage(object message) { // Photon API doesn't have a native parameter on the client-side to determine the channel number
+ public void OnMessage(object message) { // Photon API doesn't have a native parameter on the client-side to determine the channel id
byte[] data = (byte[])message;
- if (data.SequenceEqual(messageData)) {
+ if (data[0] == messageData[0]) {
OnReliableReceived?.Invoke(data);
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, data.Length);
Interlocked.Add(ref serverReliableBytesReceived, data.Length);
- } else if (data.SequenceEqual(reversedMessageData)) {
+ } else if (data[0] == reversedMessageData[0]) {
OnUnreliableReceived?.Invoke(data);
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Increment(ref serverUnreliableSent);
From 8d6cbc2ca8a6dcd1f2af2bf97920a0db799fae52 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 15:25:57 +0500
Subject: [PATCH 027/159] Optimize clients spawning in Spawn task
---
BenchmarkNet.cs | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 795c6c2..f56ce47 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -23,7 +23,6 @@
using System;
using System.Collections;
-using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
@@ -323,26 +322,26 @@ await Task.Factory.StartNew(() => {
private static async Task Spawn() {
await Task.Factory.StartNew(() => {
- List clients = new List();
+ Task[] clients = new Task[maxClients];
for (int i = 0; i < maxClients; i++) {
if (!processActive)
break;
- if (selectedNetworkingLibrary == 0)
- clients.Add(ENetBenchmark.Client());
- else if (selectedNetworkingLibrary == 1)
- clients.Add(UNetBenchmark.Client());
- else if (selectedNetworkingLibrary == 2)
- clients.Add(LiteNetLibBenchmark.Client());
- else if (selectedNetworkingLibrary == 3)
- clients.Add(LidgrenBenchmark.Client());
- else if (selectedNetworkingLibrary == 4)
- clients.Add(MiniUDPBenchmark.Client());
- else if (selectedNetworkingLibrary == 5)
- clients.Add(HazelBenchmark.Client());
+ if (selectedLibrary == 0)
+ clients[i] = ENetBenchmark.Client();
+ else if (selectedLibrary == 1)
+ clients[i] = UNetBenchmark.Client();
+ else if (selectedLibrary == 2)
+ clients[i] = LiteNetLibBenchmark.Client();
+ else if (selectedLibrary == 3)
+ clients[i] = LidgrenBenchmark.Client();
+ else if (selectedLibrary == 4)
+ clients[i] = MiniUDPBenchmark.Client();
+ else if (selectedLibrary == 5)
+ clients[i] = HazelBenchmark.Client();
else
- clients.Add(PhotonBenchmark.Client());
+ clients[i] = PhotonBenchmark.Client();
Interlocked.Increment(ref clientsStartedCount);
Thread.Sleep(15);
From b2f718588eff9d7ccfe792bac2af673c05885aae Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 15:34:06 +0500
Subject: [PATCH 028/159] Remove unused reference
---
BenchmarkNet.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f56ce47..a5cacc9 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -22,7 +22,6 @@
*/
using System;
-using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Text;
From dfd71dee45e4ab79c5004609bad99423e5e624a7 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 18:31:16 +0500
Subject: [PATCH 029/159] Change GC latency mode to SustainedLowLatency
---
BenchmarkNet.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index a5cacc9..5dbc96b 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -24,6 +24,7 @@
using System;
using System.Diagnostics;
using System.IO;
+using System.Runtime;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -190,6 +191,8 @@ private static void Main() {
Console.Clear();
processActive = true;
+
+ GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
if (selectedNetworkingLibrary == 0)
Library.Initialize();
From 556ce11cb3c52ff50663170a7de5b39336c6cfce Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 18:39:15 +0500
Subject: [PATCH 030/159] Minor change of variables
---
BenchmarkNet.cs | 38 +++++++++++++++++++-------------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 5dbc96b..69dac17 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -88,7 +88,7 @@ public class BenchmarkNet {
protected static volatile int clientsUnreliableBytesSent = 0;
protected static volatile int clientsUnreliableBytesReceived = 0;
private static ushort maxPeers = 0;
- private static byte selectedNetworkingLibrary = 0;
+ private static byte selectedLibrary = 0;
private static readonly string[] networkingLibraries = {
"ENet",
"UNet",
@@ -116,7 +116,7 @@ private static void Main() {
}
Console.Write(Environment.NewLine + "Enter the number (default 0): ");
- Byte.TryParse(Console.ReadLine(), out selectedNetworkingLibrary);
+ Byte.TryParse(Console.ReadLine(), out selectedLibrary);
ushort defaultPort = 9500;
@@ -194,26 +194,26 @@ private static void Main() {
GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
- if (selectedNetworkingLibrary == 0)
+ if (selectedLibrary == 0)
Library.Initialize();
maxPeers = ushort.MaxValue;
- maxClientsPass = (selectedNetworkingLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
+ maxClientsPass = (selectedLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
if (!maxClientsPass)
- maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedNetworkingLibrary > 0 ? maxPeers : (ushort)Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
+ maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedLibrary > 0 ? maxPeers : (ushort)Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
- if (selectedNetworkingLibrary == 0)
+ if (selectedLibrary == 0)
serverThread = new Thread(ENetBenchmark.Server);
- else if (selectedNetworkingLibrary == 1)
+ else if (selectedLibrary == 1)
serverThread = new Thread(UNetBenchmark.Server);
- else if (selectedNetworkingLibrary == 2)
+ else if (selectedLibrary == 2)
serverThread = new Thread(LiteNetLibBenchmark.Server);
- else if (selectedNetworkingLibrary == 3)
+ else if (selectedLibrary == 3)
serverThread = new Thread(LidgrenBenchmark.Server);
- else if (selectedNetworkingLibrary == 4)
+ else if (selectedLibrary == 4)
serverThread = new Thread(MiniUDPBenchmark.Server);
- else if (selectedNetworkingLibrary == 5)
+ else if (selectedLibrary == 5)
serverThread = new Thread(HazelBenchmark.Server);
else
serverThread = new Thread(PhotonBenchmark.Server);
@@ -235,20 +235,20 @@ await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
string spinner = "";
- Stopwatch stopwatch = new Stopwatch();
+ Stopwatch elapsedTime = new Stopwatch();
- stopwatch.Start();
+ elapsedTime.Start();
while (processActive) {
Console.CursorVisible = false;
Console.SetCursorPosition(0, 0);
- Console.WriteLine("Benchmarking " + networkingLibraries[selectedNetworkingLibrary] + "...");
+ Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
Console.WriteLine(maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("This networking library doesn't support more than " + (selectedNetworkingLibrary > 0 ? maxPeers : Native.ENET_PROTOCOL_MAXIMUM_PEER_ID) + " peers per server!");
+ Console.WriteLine("This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : Native.ENET_PROTOCOL_MAXIMUM_PEER_ID) + " peers per server!");
Console.ResetColor();
}
@@ -261,7 +261,7 @@ await Task.Factory.StartNew(() => {
Console.WriteLine("Clients received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
Console.WriteLine("Total - Reliable: " + ((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived) + " messages (" + ((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived) + " bytes), Unreliable: " + ((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived) + " messages (" + ((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived) + " bytes)");
Console.WriteLine("Expected - Reliable: " + (maxClients * (ulong)reliableMessages * 4) + " messages (" + (maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4) + " bytes), Unreliable: " + (maxClients * (ulong)unreliableMessages * 4) + " messages (" + (maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4) + " bytes)");
- Console.WriteLine("Elapsed time: " + stopwatch.Elapsed.Hours.ToString("00") + ":" + stopwatch.Elapsed.Minutes.ToString("00") + ":" + stopwatch.Elapsed.Seconds.ToString("00"));
+ Console.WriteLine("Elapsed time: " + elapsedTime.Elapsed.Hours.ToString("00") + ":" + elapsedTime.Elapsed.Minutes.ToString("00") + ":" + elapsedTime.Elapsed.Seconds.ToString("00"));
if (spinnerTimer >= 10) {
spinnerSequence++;
@@ -290,7 +290,7 @@ await Task.Factory.StartNew(() => {
Console.WriteLine("Process completed! Press any key to exit...");
}
- stopwatch.Stop();
+ elapsedTime.Stop();
}, TaskCreationOptions.LongRunning);
}
@@ -317,7 +317,7 @@ await Task.Factory.StartNew(() => {
lastData = currentData;
}
- if (selectedNetworkingLibrary == 0)
+ if (selectedLibrary == 0)
Library.Deinitialize();
}, TaskCreationOptions.LongRunning);
}
@@ -1341,5 +1341,5 @@ await Task.Factory.StartNew(() => {
client.Disconnect();
}, TaskCreationOptions.LongRunning);
}
- }
+ }
}
From 76860e9aee2b1b1204fd4b84666999d64a7f5ede Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 19:35:46 +0500
Subject: [PATCH 031/159] Change child task option of the client to
AttachedToParent
---
BenchmarkNet.cs | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 69dac17..b7a5fa4 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -458,7 +458,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
while (processActive) {
client.Service(1000 / clientTickRate, out netEvent);
@@ -612,7 +612,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
int hostID, connectionID, channelID, dataLength;
byte[] buffer = new byte[1024];
@@ -759,7 +759,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
listener.PeerConnectedEvent += (peer) => {
Interlocked.Increment(ref clientsConnectedCount);
@@ -901,7 +901,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
NetIncomingMessage netMessage;
@@ -1036,7 +1036,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
client.PeerConnected += (peer, token) => {
Interlocked.Increment(ref clientsConnectedCount);
@@ -1155,7 +1155,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
if (client.State == Hazel.ConnectionState.Connected) {
Interlocked.Increment(ref clientsConnectedCount);
@@ -1309,7 +1309,7 @@ await Task.Factory.StartNew(() => {
await Task.Delay(1000 / sendRate);
}
- }, TaskCreationOptions.LongRunning);
+ }, TaskCreationOptions.AttachedToParent);
listener.OnConnected += () => {
Interlocked.Increment(ref clientsConnectedCount);
From 54ddeaab438b992291700b9984458be0242c52bf Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 19:36:50 +0500
Subject: [PATCH 032/159] Revert change of GC latency mode
---
BenchmarkNet.cs | 3 ---
1 file changed, 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index b7a5fa4..d375ab6 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -24,7 +24,6 @@
using System;
using System.Diagnostics;
using System.IO;
-using System.Runtime;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -191,8 +190,6 @@ private static void Main() {
Console.Clear();
processActive = true;
-
- GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
if (selectedLibrary == 0)
Library.Initialize();
From 19854b8b83a4f3d720faa9da2e26f95f3abda842 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 22 Jan 2018 21:30:54 +0500
Subject: [PATCH 033/159] Update README.md
---
README.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 5bbd3ec..b53ecef 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,12 @@
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
+Features:
+- Asynchronous simulation of a large number of clients
+- Stable under high loads
+- Simple and flexible simulation setup
+- Detailed session information
+
Supported networking solutions:
- [ENet](https://github.com/lsalzman/enet "ENet") ([C# Wrapper](https://github.com/NateShoffner/ENetSharp "C# Wrapper"))
- [UNet](https://docs.unity3d.com/Manual/UNetUsingTransport.html "UNet")
@@ -15,12 +21,6 @@ Supported networking solutions:
- [Hazel](https://github.com/DarkRiftNetworking/Hazel-Networking "Hazel")
- [Photon](https://www.photonengine.com/en/OnPremise "Photon")
-Features:
-- Asynchronous simulation of a large number of clients
-- Stable under high loads
-- Simple and flexible simulation setup
-- Detailed session information
-
You can find the latest benchmark results on the [wiki page](https://github.com/nxrighthere/BenchmarkNet/wiki/Benchmark-Results).
How it works?
From 8bb1753758ebc3c21d07ea246bb52aab5913c946 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 10:23:41 +0500
Subject: [PATCH 034/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index b53ecef..cdc046d 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere), [Ko-fi](https://ko-fi.com/nxrighthere "Ko-fi") or [Yandex](https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=nxrighthere&targets-hint=&default-sum=100&button-text=14&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=41001289261209 "Yandex").
+This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere) or [Yandex](https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=nxrighthere&targets-hint=&default-sum=100&button-text=14&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=41001289261209 "Yandex").
Any support is much appreciated.
From 76f76e5cce467fe828fc4a538d7f32cbb2a8c222 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 11:44:28 +0500
Subject: [PATCH 035/159] Fix connection check for Hazel client
---
BenchmarkNet.cs | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index d375ab6..3dc478f 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1154,12 +1154,6 @@ await Task.Factory.StartNew(() => {
}
}, TaskCreationOptions.AttachedToParent);
- if (client.State == Hazel.ConnectionState.Connected) {
- Interlocked.Increment(ref clientsConnectedCount);
- Interlocked.Exchange(ref reliableToSend, reliableMessages);
- Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
- }
-
client.Disconnected += (sender, data) => {
Interlocked.Increment(ref clientsDisconnectedCount);
Interlocked.Exchange(ref reliableToSend, 0);
@@ -1178,7 +1172,16 @@ await Task.Factory.StartNew(() => {
data.Recycle();
};
+ bool connected = false;
+
while (processActive) {
+ if (!connected && client.State == Hazel.ConnectionState.Connected) {
+ connected = true;
+ Interlocked.Increment(ref clientsConnectedCount);
+ Interlocked.Exchange(ref reliableToSend, reliableMessages);
+ Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
+ }
+
Thread.Sleep(1000 / clientTickRate);
}
From eae93341adfdabb577605cac329cd5928690a720 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 16:21:42 +0500
Subject: [PATCH 036/159] Fix the order of interlocked functions
---
BenchmarkNet.cs | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 3dc478f..11dc7d2 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -59,7 +59,7 @@ public class BenchmarkNet {
protected static string message = "";
protected static char[] reversedMessage;
protected static byte[] messageData;
- protected static byte[] reversedMessageData;
+ protected static byte[] reversedData;
protected static bool processActive = false;
protected static bool processCompleted = false;
protected static bool processOverload = false;
@@ -184,7 +184,7 @@ private static void Main() {
reversedMessage = message.ToCharArray();
Array.Reverse(reversedMessage);
messageData = Encoding.ASCII.GetBytes(message);
- reversedMessageData = Encoding.ASCII.GetBytes(new string(reversedMessage));
+ reversedData = Encoding.ASCII.GetBytes(new string(reversedMessage));
Console.CursorVisible = false;
Console.Clear();
@@ -377,16 +377,16 @@ public static void Server() {
if (netEvent.ChannelID == 2) {
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Length);
SendReliable(messageData, 0, netEvent.Peer);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
} else if (netEvent.ChannelID == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
SendUnreliable(messageData, 1, netEvent.Peer);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
}
netEvent.Packet.Dispose();
@@ -529,16 +529,16 @@ public static void Server() {
case NetworkEventType.DataEvent:
if (channelID == 0) {
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, dataLength);
server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out error);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverReliableBytesReceived, dataLength);
} else if (channelID == 1) {
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
server.Send(hostID, connectionID, unreliableChannel, messageData, messageData.Length, out error);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
}
break;
@@ -682,16 +682,16 @@ public static void Server() {
if (deliveryMethod == DeliveryMethod.ReliableOrdered) {
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Length);
SendReliable(messageData, peer);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
} else if (deliveryMethod == DeliveryMethod.Sequenced) {
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
SendUnreliable(messageData, peer);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
}
};
@@ -822,16 +822,16 @@ public static void Server() {
if (netMessage.SequenceChannel == 2) {
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Length);
SendReliable(messageData, netMessage.SenderConnection, server.CreateMessage(), 0);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
} else if (netMessage.SequenceChannel == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
SendUnreliable(messageData, netMessage.SenderConnection, server.CreateMessage(), 1);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
}
break;
@@ -961,18 +961,18 @@ public static void Server() {
server.PeerNotification += (peer, data, dataLength) => {
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, dataLength);
SendReliable(messageData, peer);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverReliableBytesReceived, dataLength);
};
server.PeerPayload += (peer, data, dataLength) => {
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
SendUnreliable(messageData, peer);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
};
while (processActive) {
@@ -1077,16 +1077,16 @@ public static void Server() {
netEvent.Connection.DataReceived += (sender, data) => {
if (data.SendOption == SendOption.Reliable) {
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Bytes.Length);
((Connection)sender).SendBytes(messageData, SendOption.Reliable);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverReliableBytesReceived, data.Bytes.Length);
} else if (data.SendOption == SendOption.None) {
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Bytes.Length);
((Connection)sender).SendBytes(messageData, SendOption.None);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Bytes.Length);
}
data.Recycle();
@@ -1197,21 +1197,21 @@ private class PhotonPeerListener : IPhotonPeerListener {
public event Action OnReliableReceived;
public event Action OnUnreliableReceived;
- public void OnMessage(object message) { // Photon API doesn't have a native parameter on the client-side to determine the channel id
+ public void OnMessage(object message) {
byte[] data = (byte[])message;
if (data[0] == messageData[0]) {
OnReliableReceived?.Invoke(data);
Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Length);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, data.Length);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
- } else if (data[0] == reversedMessageData[0]) {
+ } else if (data[0] == reversedData[0]) {
OnUnreliableReceived?.Invoke(data);
Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, data.Length);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
}
}
@@ -1284,11 +1284,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- client.SendMessage(reversedMessageData, false, 1, false);
+ client.SendMessage(reversedData, false, 1, false);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, reversedMessageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
From 05fb92fafa26cca28a7813c74bc9a2d6ce63983c Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 16:29:06 +0500
Subject: [PATCH 037/159] Add connection check of the client for Hazel server
---
BenchmarkNet.cs | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 11dc7d2..8eeb1f9 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1075,16 +1075,24 @@ public static void Server() {
server.NewConnection += (peer, netEvent) => {
netEvent.Connection.DataReceived += (sender, data) => {
+ Connection client = (Connection)sender;
+
if (data.SendOption == SendOption.Reliable) {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, data.Bytes.Length);
- ((Connection)sender).SendBytes(messageData, SendOption.Reliable);
+
+ if (client.State == Hazel.ConnectionState.Connected)
+ client.SendBytes(messageData, SendOption.Reliable);
+
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (data.SendOption == SendOption.None) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, data.Bytes.Length);
- ((Connection)sender).SendBytes(messageData, SendOption.None);
+
+ if (client.State == Hazel.ConnectionState.Connected)
+ client.SendBytes(messageData, SendOption.None);
+
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
}
From b426aacad813416863aff135f88b76aee40057b6 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 19:08:47 +0500
Subject: [PATCH 038/159] Add optional Sustained Low Latency mode
---
BenchmarkNet.cs | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 8eeb1f9..70ef8dd 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -24,6 +24,7 @@
using System;
using System.Diagnostics;
using System.IO;
+using System.Runtime;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -47,7 +48,7 @@
namespace BenchmarkNet {
public class BenchmarkNet {
protected const string title = "BenchmarkNet";
- protected const string version = "1.03";
+ protected const string version = "1.04";
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
protected static ushort maxClients = 0;
@@ -64,6 +65,7 @@ public class BenchmarkNet {
protected static bool processCompleted = false;
protected static bool processOverload = false;
protected static bool processFailure = false;
+ protected static bool lowLatencyMode = false;
protected static bool maxClientsPass = true;
protected static Thread serverThread;
protected static volatile int clientsStartedCount = 0;
@@ -101,13 +103,28 @@ public class BenchmarkNet {
private static Func Space = (value) => ("".PadRight(value));
private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
- private static void Main() {
+ private static void Main(string[] arguments) {
Console.Title = title;
+
+ for (int i = 0; i < arguments.Length; i++) {
+ string argument = arguments[i];
+
+ if (argument == "lowlatency")
+ lowLatencyMode = true;
+ }
+
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
Console.WriteLine("Welcome to " + title + "!");
Console.WriteLine("Version " + version);
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
+
+ if (lowLatencyMode) {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine(Environment.NewLine + "The process will perform in Sustained Low Latency mode.");
+ Console.ResetColor();
+ }
+
Console.WriteLine(Environment.NewLine + "Select a networking library");
for (int i = 0; i < networkingLibraries.Length; i++) {
@@ -191,6 +208,9 @@ private static void Main() {
processActive = true;
+ if (lowLatencyMode)
+ GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
+
if (selectedLibrary == 0)
Library.Initialize();
@@ -249,6 +269,12 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
+ if (lowLatencyMode) {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine(Environment.NewLine + "The process is performing in Sustained Low Latency mode.");
+ Console.ResetColor();
+ }
+
Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
From 1eb518d302714e1a6439b6175061c57284a1b508 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 22:07:49 +0500
Subject: [PATCH 039/159] Fix argument typo
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 70ef8dd..59feacd 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -109,7 +109,7 @@ private static void Main(string[] arguments) {
for (int i = 0; i < arguments.Length; i++) {
string argument = arguments[i];
- if (argument == "lowlatency")
+ if (argument == "-lowlatency")
lowLatencyMode = true;
}
From b374d9e2df8dff222c5aa91e254f4b823ab8ab86 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 23 Jan 2018 23:06:10 +0500
Subject: [PATCH 040/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index cdc046d..5485b31 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,6 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere) or [Yandex](https://money.yandex.ru/quickpay/shop-widget?writer=seller&targets=nxrighthere&targets-hint=&default-sum=100&button-text=14&payment-type-choice=on&mobile-payment-type-choice=on&hint=&successURL=&quickpay=shop&account=41001289261209 "Yandex").
+This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
Any support is much appreciated.
From bf2a93b4b85c82e0a440a584c4cf202ef46cec4a Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 24 Jan 2018 09:44:18 +0500
Subject: [PATCH 041/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 5485b31..44210dc 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
-BenchmarkNet is a console application for testing the reliable UDP networking solutions.
+BenchmarkNet is a console application for testing the reliable UDP networking libraries.
Features:
- Asynchronous simulation of a large number of clients
From cc8d2660d863a2382ec52e6dc99887e2e929baea Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 24 Jan 2018 09:46:25 +0500
Subject: [PATCH 042/159] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 44210dc..da23d30 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
-BenchmarkNet is a console application for testing the reliable UDP networking libraries.
+BenchmarkNet is a console application for testing the reliable UDP networking solutions.
Features:
- Asynchronous simulation of a large number of clients
@@ -12,7 +12,7 @@ Features:
- Simple and flexible simulation setup
- Detailed session information
-Supported networking solutions:
+Supported networking libraries:
- [ENet](https://github.com/lsalzman/enet "ENet") ([C# Wrapper](https://github.com/NateShoffner/ENetSharp "C# Wrapper"))
- [UNet](https://docs.unity3d.com/Manual/UNetUsingTransport.html "UNet")
- [LiteNetLib](https://github.com/RevenantX/LiteNetLib "LiteNetLib")
From e33d8bf33daae615b45012b481d26b31aa5516f8 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 24 Jan 2018 09:55:01 +0500
Subject: [PATCH 043/159] Update BenchmarkNet.cs
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 59feacd..c2f8a1e 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1,5 +1,5 @@
/*
- * BenchmarkNet is a console application for testing the reliable UDP networking libraries
+ * BenchmarkNet is a console application for testing the reliable UDP networking solutions
* Copyright (c) 2018 Stanislav Denisov
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
From d8ff80bb4f69a6d9852051741fbbb33aa0163f3c Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 24 Jan 2018 22:39:57 +0500
Subject: [PATCH 044/159] Minor fix for output text
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index c2f8a1e..5d98cc7 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -261,7 +261,7 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, 0);
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(maxClients + " client" + (maxClients > 1 ? "s" : "") + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
From 839262033bec1cd9876dd66f8dabf23955f053f1 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 25 Jan 2018 12:11:38 +0500
Subject: [PATCH 045/159] Update README.md
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index da23d30..cde945e 100644
--- a/README.md
+++ b/README.md
@@ -45,4 +45,6 @@ Donations
--------
This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
+Bitcoin `173ZRNuT4k7ss7rAVmNCZr6hLfFY4DZubU` Litecoin `LhdxsS7AUhUrKMmMyTX1yL4EQp6tzSonDT`
+
Any support is much appreciated.
From 75c5eb9e95163b48adfe8a6fac48d0734d3236fd Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 25 Jan 2018 14:44:49 +0500
Subject: [PATCH 046/159] Minor fix to order of functions for Photon client
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 5d98cc7..92f6272 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1235,17 +1235,17 @@ public void OnMessage(object message) {
byte[] data = (byte[])message;
if (data[0] == messageData[0]) {
- OnReliableReceived?.Invoke(data);
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, data.Length);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, data.Length);
+ OnReliableReceived?.Invoke(data);
} else if (data[0] == reversedData[0]) {
- OnUnreliableReceived?.Invoke(data);
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, data.Length);
+ OnUnreliableReceived?.Invoke(data);
}
}
From b59264ab594b54296eccb43ab068e081e99c1180 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 25 Jan 2018 23:10:39 +0500
Subject: [PATCH 047/159] Minor fix for Hazel server
---
BenchmarkNet.cs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 92f6272..aaaa436 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1107,20 +1107,20 @@ public static void Server() {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, data.Bytes.Length);
- if (client.State == Hazel.ConnectionState.Connected)
+ if (client.State == Hazel.ConnectionState.Connected) {
client.SendBytes(messageData, SendOption.Reliable);
-
- Interlocked.Increment(ref serverReliableSent);
- Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ }
} else if (data.SendOption == SendOption.None) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, data.Bytes.Length);
- if (client.State == Hazel.ConnectionState.Connected)
+ if (client.State == Hazel.ConnectionState.Connected) {
client.SendBytes(messageData, SendOption.None);
-
- Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ }
}
data.Recycle();
From 7c274703ac2a85d83ee8fdaa4cffc80ebb5fdaea Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 26 Jan 2018 10:52:30 +0500
Subject: [PATCH 048/159] Update README.md
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index cde945e..ca736e0 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
@@ -43,7 +43,8 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
+This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
+or [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
Bitcoin `173ZRNuT4k7ss7rAVmNCZr6hLfFY4DZubU` Litecoin `LhdxsS7AUhUrKMmMyTX1yL4EQp6tzSonDT`
From 6be7ce5b7d7dd6167508a895a4cbac76c5564afd Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 26 Jan 2018 13:58:41 +0500
Subject: [PATCH 049/159] Update README.md
---
README.md | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ca736e0..8acf4d7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
@@ -49,3 +49,9 @@ or [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere
Bitcoin `173ZRNuT4k7ss7rAVmNCZr6hLfFY4DZubU` Litecoin `LhdxsS7AUhUrKMmMyTX1yL4EQp6tzSonDT`
Any support is much appreciated.
+
+Supporters
+--------
+
+
+
From 3e4057dfdc8a902cab420ddc4a4427bda1c7ad2b Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 27 Jan 2018 11:15:39 +0500
Subject: [PATCH 050/159] Increase the server thread priority
---
BenchmarkNet.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index aaaa436..5cd6911 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -48,7 +48,7 @@
namespace BenchmarkNet {
public class BenchmarkNet {
protected const string title = "BenchmarkNet";
- protected const string version = "1.04";
+ protected const string version = "1.05";
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
protected static ushort maxClients = 0;
@@ -235,6 +235,8 @@ private static void Main(string[] arguments) {
else
serverThread = new Thread(PhotonBenchmark.Server);
+ serverThread.Priority = ThreadPriority.AboveNormal;
+
serverThread.Start();
Thread.Sleep(100);
From ddce363404496728cb367e01ab4544ebaa4ba242 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 27 Jan 2018 19:33:46 +0500
Subject: [PATCH 051/159] Minor change for ENet library
---
BenchmarkNet.cs | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 5cd6911..7374565 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -212,7 +212,7 @@ private static void Main(string[] arguments) {
GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
if (selectedLibrary == 0)
- Library.Initialize();
+ ENet.Library.Initialize();
maxPeers = ushort.MaxValue;
maxClientsPass = (selectedLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
@@ -236,7 +236,6 @@ private static void Main(string[] arguments) {
serverThread = new Thread(PhotonBenchmark.Server);
serverThread.Priority = ThreadPriority.AboveNormal;
-
serverThread.Start();
Thread.Sleep(100);
@@ -343,7 +342,7 @@ await Task.Factory.StartNew(() => {
}
if (selectedLibrary == 0)
- Library.Deinitialize();
+ ENet.Library.Deinitialize();
}, TaskCreationOptions.LongRunning);
}
From 4168e206f0eb1ae62b61116c769ef6ba8417ae6d Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 28 Jan 2018 00:23:04 +0500
Subject: [PATCH 052/159] Remove redundant operators that throw
NullReferenceException
---
BenchmarkNet.cs | 102 ++++++++++++++++++++++++------------------------
1 file changed, 50 insertions(+), 52 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7374565..0884c9c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -390,36 +390,35 @@ private static void SendUnreliable(byte[] data, byte channelID, Peer peer) {
}
public static void Server() {
- using (Host server = new Host()) {
- server.Create(port, maxClients);
-
- Event netEvent = new Event();
+ Host server = new Host();
+ server.Create(port, maxClients);
+
+ Event netEvent = new Event();
- while (processActive) {
- server.Service(1000 / serverTickRate, out netEvent);
+ while (processActive) {
+ server.Service(1000 / serverTickRate, out netEvent);
- switch (netEvent.Type) {
- case EventType.Receive:
- byte[] data = netEvent.Packet.GetBytes();
+ switch (netEvent.Type) {
+ case EventType.Receive:
+ byte[] data = netEvent.Packet.GetBytes();
- if (netEvent.ChannelID == 2) {
- Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
- SendReliable(messageData, 0, netEvent.Peer);
- Interlocked.Increment(ref serverReliableSent);
- Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- } else if (netEvent.ChannelID == 3) {
- Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
- SendUnreliable(messageData, 1, netEvent.Peer);
- Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- }
+ if (netEvent.ChannelID == 2) {
+ Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, data.Length);
+ SendReliable(messageData, 0, netEvent.Peer);
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ } else if (netEvent.ChannelID == 3) {
+ Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
+ SendUnreliable(messageData, 1, netEvent.Peer);
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ }
- netEvent.Packet.Dispose();
+ netEvent.Packet.Dispose();
- break;
- }
+ break;
}
}
}
@@ -541,39 +540,38 @@ public static void Server() {
topology.SentMessagePoolSize = ushort.MaxValue;
topology.ReceivedMessagePoolSize = ushort.MaxValue;
- using (NetLibraryManager server = new NetLibraryManager(globalConfig)) {
- int host = server.AddHost(topology, port, ip);
+ NetLibraryManager server = new NetLibraryManager(globalConfig);
+ int host = server.AddHost(topology, port, ip);
- int hostID, connectionID, channelID, dataLength;
- byte[] buffer = new byte[1024];
- NetworkEventType netEvent;
+ int hostID, connectionID, channelID, dataLength;
+ byte[] buffer = new byte[1024];
+ NetworkEventType netEvent;
- while (processActive) {
- byte error;
+ while (processActive) {
+ byte error;
- while ((netEvent = server.Receive(out hostID, out connectionID, out channelID, buffer, buffer.Length, out dataLength, out error)) != NetworkEventType.Nothing) {
- switch (netEvent) {
- case NetworkEventType.DataEvent:
- if (channelID == 0) {
- Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out error);
- Interlocked.Increment(ref serverReliableSent);
- Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- } else if (channelID == 1) {
- Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, unreliableChannel, messageData, messageData.Length, out error);
- Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
- }
+ while ((netEvent = server.Receive(out hostID, out connectionID, out channelID, buffer, buffer.Length, out dataLength, out error)) != NetworkEventType.Nothing) {
+ switch (netEvent) {
+ case NetworkEventType.DataEvent:
+ if (channelID == 0) {
+ Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, dataLength);
+ server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out error);
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ } else if (channelID == 1) {
+ Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
+ server.Send(hostID, connectionID, unreliableChannel, messageData, messageData.Length, out error);
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ }
- break;
- }
+ break;
}
-
- Thread.Sleep(1000 / serverTickRate);
}
+
+ Thread.Sleep(1000 / serverTickRate);
}
}
From bb9cbc8482d012438bdeeee832cd6c547dc4f7ae Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 28 Jan 2018 01:40:30 +0500
Subject: [PATCH 053/159] Remove redundant Invoke methods
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 0884c9c..4c03318 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1238,13 +1238,13 @@ public void OnMessage(object message) {
Interlocked.Add(ref serverReliableBytesReceived, data.Length);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, data.Length);
- OnReliableReceived?.Invoke(data);
+ OnReliableReceived(data);
} else if (data[0] == reversedData[0]) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, data.Length);
- OnUnreliableReceived?.Invoke(data);
+ OnUnreliableReceived(data);
}
}
From 54a8fdf7536bb479e37ef7a0cb48ff5a3f38b4e0 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 28 Jan 2018 13:55:43 +0500
Subject: [PATCH 054/159] Add support for Neutrino
---
BenchmarkNet.cs | 152 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 149 insertions(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 4c03318..9b56055 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -44,6 +44,9 @@
using Hazel.Udp;
// Photon (https://www.photonengine.com/en/OnPremise)
using ExitGames.Client.Photon;
+// Neutrino (https://github.com/Claytonious/Neutrino)
+using Neutrino.Core;
+using Neutrino.Core.Messages;
namespace BenchmarkNet {
public class BenchmarkNet {
@@ -97,7 +100,8 @@ public class BenchmarkNet {
"Lidgren",
"MiniUDP",
"Hazel",
- "Photon"
+ "Photon",
+ "Neutrino"
};
private static Func Space = (value) => ("".PadRight(value));
@@ -232,8 +236,10 @@ private static void Main(string[] arguments) {
serverThread = new Thread(MiniUDPBenchmark.Server);
else if (selectedLibrary == 5)
serverThread = new Thread(HazelBenchmark.Server);
- else
+ else if (selectedLibrary == 6)
serverThread = new Thread(PhotonBenchmark.Server);
+ else
+ serverThread = new Thread(NeutrinoBenchmark.Server);
serverThread.Priority = ThreadPriority.AboveNormal;
serverThread.Start();
@@ -366,8 +372,10 @@ await Task.Factory.StartNew(() => {
clients[i] = MiniUDPBenchmark.Client();
else if (selectedLibrary == 5)
clients[i] = HazelBenchmark.Client();
- else
+ else if (selectedLibrary == 6)
clients[i] = PhotonBenchmark.Client();
+ else
+ clients[i] = NeutrinoBenchmark.Client();
Interlocked.Increment(ref clientsStartedCount);
Thread.Sleep(15);
@@ -1375,4 +1383,142 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.LongRunning);
}
}
+
+ public class NeutrinoBenchmark : BenchmarkNet {
+ private class ReliableMessage : NetworkMessage {
+ public ReliableMessage() {
+ IsGuaranteed = true;
+ }
+
+ [MsgPack.Serialization.MessagePackMember(0)]
+ public string Message { get; set; }
+ }
+
+ private class UnreliableMessage : NetworkMessage {
+ public UnreliableMessage() {
+ IsGuaranteed = false;
+ }
+
+ [MsgPack.Serialization.MessagePackMember(0)]
+ public string Message { get; set; }
+ }
+
+ public static void Server() {
+ Node server = new Node(port, typeof(NeutrinoBenchmark).Assembly);
+
+ server.OnReceived += (message) => {
+ NetworkPeer peer = message.Source;
+
+ if (message is ReliableMessage) {
+ ReliableMessage reliableMessage = message as ReliableMessage;
+ Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, reliableMessage.Message.Length);
+ peer.SendNetworkMessage(server.GetMessage());
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ } else if (message is UnreliableMessage) {
+ UnreliableMessage unreliableMessage = message as UnreliableMessage;
+ Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, unreliableMessage.Message.Length);
+ peer.SendNetworkMessage(server.GetMessage());
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ }
+ };
+
+ server.Start();
+
+ while (processActive) {
+ server.Update();
+ Thread.Sleep(1000 / serverTickRate);
+ }
+ }
+
+ public static async Task Client() {
+ await Task.Factory.StartNew(() => {
+ Node client = new Node(Task.CurrentId.ToString(), ip, port, typeof(NeutrinoBenchmark).Assembly);
+
+ int reliableToSend = 0;
+ int unreliableToSend = 0;
+ int reliableSentCount = 0;
+ int unreliableSentCount = 0;
+
+ Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
+ while (processActive) {
+ if (reliableToSend > 0) {
+ ReliableMessage reliableMessage = client.GetMessage();
+ reliableMessage.Message = message;
+ client.SendToAll(reliableMessage);
+ Interlocked.Decrement(ref reliableToSend);
+ Interlocked.Increment(ref reliableSentCount);
+ Interlocked.Increment(ref clientsReliableSent);
+ Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
+ }
+
+ if (unreliableToSend > 0) {
+ UnreliableMessage unreliableMessage = client.GetMessage();
+ unreliableMessage.Message = message;
+ client.SendToAll(unreliableMessage);
+ Interlocked.Decrement(ref unreliableToSend);
+ Interlocked.Increment(ref unreliableSentCount);
+ Interlocked.Increment(ref clientsUnreliableSent);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
+ }
+
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ await Task.Delay(1000 / sendRate);
+ }
+ }, TaskCreationOptions.AttachedToParent);
+
+ client.OnPeerConnected += (peer) => {
+ Interlocked.Increment(ref clientsConnectedCount);
+ Interlocked.Exchange(ref reliableToSend, reliableMessages);
+ Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
+ };
+
+ client.OnPeerDisconnected += (peer) => {
+ Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
+ };
+
+ client.OnReceived += (message) => {
+ if (message is ReliableMessage) {
+ ReliableMessage reliableMessage = message as ReliableMessage;
+ Interlocked.Increment(ref clientsReliableReceived);
+ Interlocked.Add(ref clientsReliableBytesReceived, reliableMessage.Message.Length);
+ } else if (message is UnreliableMessage) {
+ UnreliableMessage unreliableMessage = message as UnreliableMessage;
+ Interlocked.Increment(ref clientsUnreliableReceived);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, unreliableMessage.Message.Length);
+ }
+ };
+
+ client.Start();
+
+ while (processActive) {
+ client.Update();
+ Thread.Sleep(1000 / clientTickRate);
+ }
+ }, TaskCreationOptions.LongRunning);
+ }
+ }
}
From 113be7826d18a57621ea4934e3ee60fd1dd4dd98 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 28 Jan 2018 15:05:05 +0500
Subject: [PATCH 055/159] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 8acf4d7..ef00269 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ Supported networking libraries:
- [MiniUDP](https://github.com/ashoulson/MiniUDP "MiniUDP")
- [Hazel](https://github.com/DarkRiftNetworking/Hazel-Networking "Hazel")
- [Photon](https://www.photonengine.com/en/OnPremise "Photon")
+- [Neutrino](https://github.com/Claytonious/Neutrino)
You can find the latest benchmark results on the [wiki page](https://github.com/nxrighthere/BenchmarkNet/wiki/Benchmark-Results).
From ce8510cfe7ef5fd9665d759497aa27d5f602cbf0 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 28 Jan 2018 16:33:05 +0500
Subject: [PATCH 056/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ef00269..6d4e950 100644
--- a/README.md
+++ b/README.md
@@ -54,5 +54,5 @@ Any support is much appreciated.
Supporters
--------
-
+
From 23651c513842d2164ff1e2d86cda51126b7c5f1b Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 30 Jan 2018 12:39:45 +0500
Subject: [PATCH 057/159] Remove redundant Invoke methods
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 9b56055..1119e8f 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1259,12 +1259,12 @@ public void OnMessage(object message) {
public void OnStatusChanged(StatusCode statusCode) {
switch (statusCode) {
case StatusCode.Connect:
- OnConnected.Invoke();
+ OnConnected();
break;
case StatusCode.Disconnect:
- OnDisconnected.Invoke();
+ OnDisconnected();
break;
}
From 95675127aa5385f70e14b89387babad95cff0b21 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 31 Jan 2018 16:13:41 +0500
Subject: [PATCH 058/159] Minor fix for output text
---
BenchmarkNet.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 1119e8f..5aabf7c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -259,6 +259,7 @@ await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
string spinner = "";
+ string clientString = "Client" + (maxClients > 1 ? "s" : "");
Stopwatch elapsedTime = new Stopwatch();
elapsedTime.Start();
@@ -268,7 +269,7 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, 0);
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + " client" + (maxClients > 1 ? "s" : "") + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(maxClients + " " + clientString.ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
@@ -283,12 +284,12 @@ await Task.Factory.StartNew(() => {
}
Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
- Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
+ Console.WriteLine(clientString + " status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
- Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
+ Console.WriteLine(clientString + " sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
- Console.WriteLine("Clients received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
+ Console.WriteLine(clientString + " received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
Console.WriteLine("Total - Reliable: " + ((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived) + " messages (" + ((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived) + " bytes), Unreliable: " + ((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived) + " messages (" + ((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived) + " bytes)");
Console.WriteLine("Expected - Reliable: " + (maxClients * (ulong)reliableMessages * 4) + " messages (" + (maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4) + " bytes), Unreliable: " + (maxClients * (ulong)unreliableMessages * 4) + " messages (" + (maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4) + " bytes)");
Console.WriteLine("Elapsed time: " + elapsedTime.Elapsed.Hours.ToString("00") + ":" + elapsedTime.Elapsed.Minutes.ToString("00") + ":" + elapsedTime.Elapsed.Seconds.ToString("00"));
From ac9ea7f995a5f642b53dc1945edeec412b576a21 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 31 Jan 2018 16:16:42 +0500
Subject: [PATCH 059/159] Minor change of Spinner variable
---
BenchmarkNet.cs | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 5aabf7c..6b31c28 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -258,7 +258,7 @@ private static async Task Info() {
await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
- string spinner = "";
+ string spinnerString = "";
string clientString = "Client" + (maxClients > 1 ? "s" : "");
Stopwatch elapsedTime = new Stopwatch();
@@ -302,17 +302,17 @@ await Task.Factory.StartNew(() => {
}
switch (spinnerSequence % 4) {
- case 0: spinner = "/";
+ case 0: spinnerString = "/";
break;
- case 1: spinner = "—";
+ case 1: spinnerString = "—";
break;
- case 2: spinner = "\\";
+ case 2: spinnerString = "\\";
break;
- case 3: spinner = "|";
+ case 3: spinnerString = "|";
break;
}
- Console.WriteLine(Environment.NewLine + "Press any key to stop the process " + spinner);
+ Console.WriteLine(Environment.NewLine + "Press any key to stop the process " + spinnerString);
Thread.Sleep(15);
}
From 44e49d69ac92680af3c58646c4fbfdfd5cb94325 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 31 Jan 2018 17:55:32 +0500
Subject: [PATCH 060/159] Add optional Instant mode
---
BenchmarkNet.cs | 73 ++++++++++++++++++++++++-------------------------
1 file changed, 36 insertions(+), 37 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 6b31c28..ece9c66 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -68,6 +68,7 @@ public class BenchmarkNet {
protected static bool processCompleted = false;
protected static bool processOverload = false;
protected static bool processFailure = false;
+ protected static bool instantMode = false;
protected static bool lowLatencyMode = false;
protected static bool maxClientsPass = true;
protected static Thread serverThread;
@@ -113,6 +114,9 @@ private static void Main(string[] arguments) {
for (int i = 0; i < arguments.Length; i++) {
string argument = arguments[i];
+ if (argument == "-instant")
+ instantMode = true;
+
if (argument == "-lowlatency")
lowLatencyMode = true;
}
@@ -139,66 +143,61 @@ private static void Main(string[] arguments) {
Byte.TryParse(Console.ReadLine(), out selectedLibrary);
ushort defaultPort = 9500;
+ ushort defaultMaxClients = 1000;
+ int defaultServerTickRate = 64;
+ int defaultClientTickRate = 64;
+ int defaultSendRate = 15;
+ int defaultReliableMessages = 500;
+ int defaultUnreliableMessages = 1000;
+ string defaultMessage = "Sometimes we just need a good networking library";
+
+ if (!instantMode) {
+ Console.Write("Port (default " + defaultPort + "): ");
+ UInt16.TryParse(Console.ReadLine(), out port);
+
+ Console.Write("Simulated clients (default " + defaultMaxClients + "): ");
+ UInt16.TryParse(Console.ReadLine(), out maxClients);
- Console.Write("Port (default " + defaultPort + "): ");
- UInt16.TryParse(Console.ReadLine(), out port);
+ Console.Write("Server tick rate (default " + defaultServerTickRate + "): ");
+ Int32.TryParse(Console.ReadLine(), out serverTickRate);
+
+ Console.Write("Client tick rate (default " + defaultClientTickRate + "): ");
+ Int32.TryParse(Console.ReadLine(), out clientTickRate);
+
+ Console.Write("Client send rate (default " + defaultSendRate + "): ");
+ Int32.TryParse(Console.ReadLine(), out sendRate);
+
+ Console.Write("Reliable messages per client (default " + defaultReliableMessages + "): ");
+ Int32.TryParse(Console.ReadLine(), out reliableMessages);
+
+ Console.Write("Unreliable messages per client (default " + defaultUnreliableMessages + "): ");
+ Int32.TryParse(Console.ReadLine(), out unreliableMessages);
+
+ Console.Write("Message (default " + defaultMessage.Length + " characters): ");
+ message = Console.ReadLine();
+ }
if (port == 0)
port = defaultPort;
- ushort defaultMaxClients = 1000;
-
- Console.Write("Simulated clients (default " + defaultMaxClients + "): ");
- UInt16.TryParse(Console.ReadLine(), out maxClients);
-
if (maxClients == 0)
maxClients = defaultMaxClients;
- int defaultServerTickRate = 64;
-
- Console.Write("Server tick rate (default " + defaultServerTickRate + "): ");
- Int32.TryParse(Console.ReadLine(), out serverTickRate);
-
if (serverTickRate == 0)
serverTickRate = defaultServerTickRate;
- int defaultClientTickRate = 64;
-
- Console.Write("Client tick rate (default " + defaultClientTickRate + "): ");
- Int32.TryParse(Console.ReadLine(), out clientTickRate);
-
if (clientTickRate == 0)
clientTickRate = defaultClientTickRate;
- int defaultSendRate = 15;
-
- Console.Write("Client send rate (default " + defaultSendRate + "): ");
- Int32.TryParse(Console.ReadLine(), out sendRate);
-
if (sendRate == 0)
sendRate = defaultSendRate;
- int defaultReliableMessages = 500;
-
- Console.Write("Reliable messages per client (default " + defaultReliableMessages + "): ");
- Int32.TryParse(Console.ReadLine(), out reliableMessages);
-
if (reliableMessages == 0)
reliableMessages = defaultReliableMessages;
- int defaultUnreliableMessages = 1000;
-
- Console.Write("Unreliable messages per client (default " + defaultUnreliableMessages + "): ");
- Int32.TryParse(Console.ReadLine(), out unreliableMessages);
-
if (unreliableMessages == 0)
unreliableMessages = defaultUnreliableMessages;
- string defaultMessage = "Sometimes we just need a good networking library";
-
- Console.Write("Message (default " + defaultMessage.Length + " characters): ");
- message = Console.ReadLine();
-
if (message == string.Empty)
message = defaultMessage;
From 64a3dfec6f6c55bd42e50e6c5b2bb2555f4d6ed0 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 1 Feb 2018 18:04:47 +0500
Subject: [PATCH 061/159] Replace strings in Info task with a string array
---
BenchmarkNet.cs | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ece9c66..3c85e8b 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -257,8 +257,11 @@ private static async Task Info() {
await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
- string spinnerString = "";
- string clientString = "Client" + (maxClients > 1 ? "s" : "");
+ string[] strings = {
+ "",
+ "Client" + (maxClients > 1 ? "s" : "")
+ };
+
Stopwatch elapsedTime = new Stopwatch();
elapsedTime.Start();
@@ -268,7 +271,7 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, 0);
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + " " + clientString.ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(maxClients + " " + strings[1].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
@@ -283,12 +286,12 @@ await Task.Factory.StartNew(() => {
}
Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
- Console.WriteLine(clientString + " status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
+ Console.WriteLine(strings[1] + " status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
- Console.WriteLine(clientString + " sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
+ Console.WriteLine(strings[1] + " sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
- Console.WriteLine(clientString + " received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
+ Console.WriteLine(strings[1] + " received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
Console.WriteLine("Total - Reliable: " + ((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived) + " messages (" + ((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived) + " bytes), Unreliable: " + ((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived) + " messages (" + ((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived) + " bytes)");
Console.WriteLine("Expected - Reliable: " + (maxClients * (ulong)reliableMessages * 4) + " messages (" + (maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4) + " bytes), Unreliable: " + (maxClients * (ulong)unreliableMessages * 4) + " messages (" + (maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4) + " bytes)");
Console.WriteLine("Elapsed time: " + elapsedTime.Elapsed.Hours.ToString("00") + ":" + elapsedTime.Elapsed.Minutes.ToString("00") + ":" + elapsedTime.Elapsed.Seconds.ToString("00"));
@@ -301,17 +304,17 @@ await Task.Factory.StartNew(() => {
}
switch (spinnerSequence % 4) {
- case 0: spinnerString = "/";
+ case 0: strings[0] = "/";
break;
- case 1: spinnerString = "—";
+ case 1: strings[0] = "—";
break;
- case 2: spinnerString = "\\";
+ case 2: strings[0] = "\\";
break;
- case 3: spinnerString = "|";
+ case 3: strings[0] = "|";
break;
}
- Console.WriteLine(Environment.NewLine + "Press any key to stop the process " + spinnerString);
+ Console.WriteLine(Environment.NewLine + "Press any key to stop the process " + strings[0]);
Thread.Sleep(15);
}
From 2dfad2638611fb7da57a47d172a03970ae82f20c Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 2 Feb 2018 09:45:47 +0500
Subject: [PATCH 062/159] Change arguments parsing to non case-sensitive
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 3c85e8b..b067733 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -112,7 +112,7 @@ private static void Main(string[] arguments) {
Console.Title = title;
for (int i = 0; i < arguments.Length; i++) {
- string argument = arguments[i];
+ string argument = arguments[i].ToLower();
if (argument == "-instant")
instantMode = true;
From b9dbd461999ac46037c48729fec112c4ac6801af Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 2 Feb 2018 09:48:40 +0500
Subject: [PATCH 063/159] Fix detection of a failure in Supervise task
---
BenchmarkNet.cs | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index b067733..d91a6d7 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -337,8 +337,12 @@ await Task.Factory.StartNew(() => {
decimal currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
if (currentData == lastData) {
- if (currentData != 0 && ((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
- processOverload = true;
+ if (currentData == 0) {
+ processFailure = true;
+ } else {
+ if (((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
+ processOverload = true;
+ }
processCompleted = true;
Thread.Sleep(100);
From 591feadd245ae07c7beb1100870987355497e389 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 4 Feb 2018 14:12:51 +0500
Subject: [PATCH 064/159] Move max peers values to a string array
---
BenchmarkNet.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index d91a6d7..aa77972 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -259,7 +259,8 @@ await Task.Factory.StartNew(() => {
int spinnerSequence = 0;
string[] strings = {
"",
- "Client" + (maxClients > 1 ? "s" : "")
+ "Client" + (maxClients > 1 ? "s" : ""),
+ (selectedLibrary > 0 ? maxPeers : Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString()
};
Stopwatch elapsedTime = new Stopwatch();
@@ -271,11 +272,11 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, 0);
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + " " + strings[1].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(maxClients + " " + strings[1].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : Native.ENET_PROTOCOL_MAXIMUM_PEER_ID) + " peers per server!");
+ Console.WriteLine("This networking library doesn't support more than " + strings[2] + " peers per server!");
Console.ResetColor();
}
From a0ff2e94a5c69fa0f1f536eff5324b5a2525c0c1 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 4 Feb 2018 14:39:42 +0500
Subject: [PATCH 065/159] Minor change of empty strings
---
BenchmarkNet.cs | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index aa77972..720528c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -60,7 +60,7 @@ public class BenchmarkNet {
protected static int sendRate = 0;
protected static int reliableMessages = 0;
protected static int unreliableMessages = 0;
- protected static string message = "";
+ protected static string message = String.Empty;
protected static char[] reversedMessage;
protected static byte[] messageData;
protected static byte[] reversedData;
@@ -105,7 +105,7 @@ public class BenchmarkNet {
"Neutrino"
};
- private static Func Space = (value) => ("".PadRight(value));
+ private static Func Space = (value) => (String.Empty.PadRight(value));
private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
private static void Main(string[] arguments) {
@@ -198,7 +198,7 @@ private static void Main(string[] arguments) {
if (unreliableMessages == 0)
unreliableMessages = defaultUnreliableMessages;
- if (message == string.Empty)
+ if (message == String.Empty)
message = defaultMessage;
reversedMessage = message.ToCharArray();
@@ -258,8 +258,8 @@ await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
string[] strings = {
- "",
- "Client" + (maxClients > 1 ? "s" : ""),
+ String.Empty,
+ "Client" + (maxClients > 1 ? "s" : String.Empty),
(selectedLibrary > 0 ? maxPeers : Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString()
};
@@ -1028,7 +1028,7 @@ public static async Task Client() {
await Task.Factory.StartNew(() => {
NetCore client = new NetCore(title, false);
- MiniUDP.NetPeer connection = client.Connect(NetUtil.StringToEndPoint(ip + ":" + port), "");
+ MiniUDP.NetPeer connection = client.Connect(NetUtil.StringToEndPoint(ip + ":" + port), String.Empty);
int reliableToSend = 0;
int unreliableToSend = 0;
From a2fdd703dc07a6495b346d72ae7914505d6a2964 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 5 Feb 2018 10:48:42 +0500
Subject: [PATCH 066/159] Minor change for ENet library
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 720528c..58e5d1c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -221,7 +221,7 @@ private static void Main(string[] arguments) {
maxClientsPass = (selectedLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
if (!maxClientsPass)
- maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedLibrary > 0 ? maxPeers : (ushort)Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
+ maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedLibrary > 0 ? maxPeers : (ushort)ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
if (selectedLibrary == 0)
serverThread = new Thread(ENetBenchmark.Server);
@@ -260,7 +260,7 @@ await Task.Factory.StartNew(() => {
string[] strings = {
String.Empty,
"Client" + (maxClients > 1 ? "s" : String.Empty),
- (selectedLibrary > 0 ? maxPeers : Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString()
+ (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString()
};
Stopwatch elapsedTime = new Stopwatch();
From 73f5320cf994dac8564b8097b19fa4ccde85d750 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 5 Feb 2018 14:32:42 +0500
Subject: [PATCH 067/159] Minor change for MiniUDP
---
BenchmarkNet.cs | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 58e5d1c..0643a6f 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -987,14 +987,6 @@ await Task.Factory.StartNew(() => {
}
public class MiniUDPBenchmark : BenchmarkNet {
- private static void SendReliable(byte[] data, MiniUDP.NetPeer peer) {
- peer.QueueNotification(data, (ushort)data.Length); // Reliable Ordered (https://github.com/ashoulson/MiniUDP/blob/master/MiniUDP/Threaded/NetPeer.cs#L105)
- }
-
- private static void SendUnreliable(byte[] data, MiniUDP.NetPeer peer) {
- peer.SendPayload(data, (ushort)data.Length); // Unreliable Sequenced
- }
-
public static void Server() {
NetCore server = new NetCore(title, true);
@@ -1003,7 +995,7 @@ public static void Server() {
server.PeerNotification += (peer, data, dataLength) => {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, dataLength);
- SendReliable(messageData, peer);
+ peer.QueueNotification(messageData, (ushort)messageData.Length);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
};
@@ -1011,7 +1003,7 @@ public static void Server() {
server.PeerPayload += (peer, data, dataLength) => {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
- SendUnreliable(messageData, peer);
+ peer.SendPayload(messageData, (ushort)messageData.Length);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
};
@@ -1041,7 +1033,7 @@ await Task.Factory.StartNew(() => {
while (processActive) {
if (reliableToSend > 0) {
- SendReliable(messageData, connection);
+ connection.QueueNotification(messageData, (ushort)messageData.Length);
Interlocked.Decrement(ref reliableToSend);
Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
@@ -1049,7 +1041,7 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- SendUnreliable(messageData, connection);
+ connection.SendPayload(messageData, (ushort)messageData.Length);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
From ffe7e6282a3ed2b9fc49b96134ec56c5a9a69dfb Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 6 Feb 2018 18:24:12 +0500
Subject: [PATCH 068/159] Remove whitespace
---
BenchmarkNet.cs | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 0643a6f..ae7f7a9 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -122,8 +122,7 @@ private static void Main(string[] arguments) {
}
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
- Console.WriteLine("Welcome to " + title + "!");
- Console.WriteLine("Version " + version);
+ Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
@@ -144,8 +143,8 @@ private static void Main(string[] arguments) {
ushort defaultPort = 9500;
ushort defaultMaxClients = 1000;
- int defaultServerTickRate = 64;
- int defaultClientTickRate = 64;
+ int defaultServerTickRate = 64;
+ int defaultClientTickRate = 64;
int defaultSendRate = 15;
int defaultReliableMessages = 500;
int defaultUnreliableMessages = 1000;
@@ -175,7 +174,7 @@ private static void Main(string[] arguments) {
Console.Write("Message (default " + defaultMessage.Length + " characters): ");
message = Console.ReadLine();
- }
+ }
if (port == 0)
port = defaultPort;
@@ -272,7 +271,7 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, 0);
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + " " + strings[1].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(maxClients + Space(1) + strings[1].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
@@ -985,7 +984,7 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.LongRunning);
}
}
-
+
public class MiniUDPBenchmark : BenchmarkNet {
public static void Server() {
NetCore server = new NetCore(title, true);
From aca350134884fd5cfcb239ed8719749f0b6f8af0 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 7 Feb 2018 13:13:22 +0500
Subject: [PATCH 069/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 6d4e950..0d9b0d2 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
From a47bbd2100b6263b661410dc8f215deef31fea5d Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 8 Feb 2018 23:22:41 +0500
Subject: [PATCH 070/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 0d9b0d2..1f4d48b 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ You can find the latest benchmark results on the [wiki page](https://github.com/
How it works?
--------
-Each simulated client is one asynchronous task for establishing a connection with the server and processing the network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which works independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
+Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which works independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
Usage
--------
From 9ea67b51e52d3dda7d0aa64ae3a1f3ba29bdfad4 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 9 Feb 2018 18:10:26 +0500
Subject: [PATCH 071/159] Add support for DarkRift
---
BenchmarkNet.cs | 166 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 162 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ae7f7a9..f16e0e3 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -24,6 +24,7 @@
using System;
using System.Diagnostics;
using System.IO;
+using System.Net;
using System.Runtime;
using System.Text;
using System.Threading;
@@ -47,11 +48,15 @@
// Neutrino (https://github.com/Claytonious/Neutrino)
using Neutrino.Core;
using Neutrino.Core.Messages;
+// DarkRift (https://darkriftnetworking.com/DarkRift2)
+using DarkRift;
+using DarkRift.Server;
+using DarkRift.Client;
namespace BenchmarkNet {
public class BenchmarkNet {
protected const string title = "BenchmarkNet";
- protected const string version = "1.05";
+ protected const string version = "1.06";
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
protected static ushort maxClients = 0;
@@ -102,7 +107,8 @@ public class BenchmarkNet {
"MiniUDP",
"Hazel",
"Photon",
- "Neutrino"
+ "Neutrino",
+ "DarkRift"
};
private static Func Space = (value) => (String.Empty.PadRight(value));
@@ -236,8 +242,10 @@ private static void Main(string[] arguments) {
serverThread = new Thread(HazelBenchmark.Server);
else if (selectedLibrary == 6)
serverThread = new Thread(PhotonBenchmark.Server);
- else
+ else if (selectedLibrary == 7)
serverThread = new Thread(NeutrinoBenchmark.Server);
+ else
+ serverThread = new Thread(DarkRiftBenchmark.Server);
serverThread.Priority = ThreadPriority.AboveNormal;
serverThread.Start();
@@ -381,8 +389,10 @@ await Task.Factory.StartNew(() => {
clients[i] = HazelBenchmark.Client();
else if (selectedLibrary == 6)
clients[i] = PhotonBenchmark.Client();
- else
+ else if (selectedLibrary == 7)
clients[i] = NeutrinoBenchmark.Client();
+ else
+ clients[i] = DarkRiftBenchmark.Client();
Interlocked.Increment(ref clientsStartedCount);
Thread.Sleep(15);
@@ -1520,4 +1530,152 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.LongRunning);
}
}
+
+ public class DarkRiftBenchmark : BenchmarkNet {
+ public static void Server() {
+ DarkRiftServer server = new DarkRiftServer(new ServerSpawnData(IPAddress.Parse(ip), port, IPVersion.IPv4));
+
+ server.Start();
+
+ server.ClientManager.ClientConnected += (peer, netEvent) => {
+ netEvent.Client.MessageReceived += (sender, data) => {
+ using (Message message = data.GetMessage()) {
+ using (DarkRiftReader reader = message.GetReader()) {
+ if (data.SendMode == SendMode.Reliable) {
+ Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, reader.ReadBytes().Length);
+
+ using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
+ writer.Write(messageData);
+
+ using (Message reliableMessage = Message.Create(0, writer))
+ data.Client.SendMessage(reliableMessage, SendMode.Reliable);
+ }
+
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ } else if (data.SendMode == SendMode.Unreliable) {
+ Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, reader.ReadBytes().Length);
+
+ using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
+ writer.Write(messageData);
+
+ using (Message unreliableMessage = Message.Create(0, writer))
+ data.Client.SendMessage(unreliableMessage, SendMode.Unreliable);
+ }
+
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ }
+ }
+ }
+ };
+ };
+
+ while (processActive) {
+ server.ExecuteDispatcherTasks();
+ Thread.Sleep(1000 / serverTickRate);
+ }
+ }
+
+ public static async Task Client() {
+ await Task.Factory.StartNew(() => {
+ DarkRiftClient client = new DarkRiftClient();
+
+ client.Connect(IPAddress.Parse(ip), port, IPVersion.IPv4);
+
+ int reliableToSend = 0;
+ int unreliableToSend = 0;
+ int reliableSentCount = 0;
+ int unreliableSentCount = 0;
+
+ Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
+
+ while (processActive) {
+ if (reliableToSend > 0) {
+ using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
+ writer.Write(messageData);
+
+ using (Message message = Message.Create(0, writer))
+ client.SendMessage(message, SendMode.Reliable);
+ }
+
+ Interlocked.Decrement(ref reliableToSend);
+ Interlocked.Increment(ref reliableSentCount);
+ Interlocked.Increment(ref clientsReliableSent);
+ Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
+ }
+
+ if (unreliableToSend > 0) {
+ using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
+ writer.Write(messageData);
+
+ using (Message message = Message.Create(0, writer))
+ client.SendMessage(message, SendMode.Unreliable);
+ }
+
+ Interlocked.Decrement(ref unreliableToSend);
+ Interlocked.Increment(ref unreliableSentCount);
+ Interlocked.Increment(ref clientsUnreliableSent);
+ Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ }
+
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsChannelsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsChannelsCount);
+ }
+
+ await Task.Delay(1000 / sendRate);
+ }
+ }, TaskCreationOptions.AttachedToParent);
+
+ client.Disconnected += (sender, data) => {
+ Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
+ };
+
+ client.MessageReceived += (sender, data) => {
+ using (Message message = data.GetMessage()) {
+ using (DarkRiftReader reader = message.GetReader()) {
+ if (data.SendMode == SendMode.Reliable) {
+ Interlocked.Increment(ref clientsReliableReceived);
+ Interlocked.Add(ref clientsReliableBytesReceived, reader.ReadBytes().Length);
+ } else if (data.SendMode == SendMode.Unreliable) {
+ Interlocked.Increment(ref clientsUnreliableReceived);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, reader.ReadBytes().Length);
+ }
+ }
+ }
+ };
+
+ bool connected = false;
+
+ while (processActive) {
+ if (!connected && client.Connected) {
+ connected = true;
+ Interlocked.Increment(ref clientsConnectedCount);
+ Interlocked.Exchange(ref reliableToSend, reliableMessages);
+ Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
+ }
+
+ Thread.Sleep(1000 / clientTickRate);
+ }
+ }, TaskCreationOptions.LongRunning);
+ }
+ }
}
From b0f0e65c79988276fdbaeb489b62864f28071745 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Feb 2018 16:10:09 +0500
Subject: [PATCH 072/159] Fix writing/reading of byte arrays for DarkRift
---
BenchmarkNet.cs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f16e0e3..09bb6b0 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1543,10 +1543,10 @@ public static void Server() {
using (DarkRiftReader reader = message.GetReader()) {
if (data.SendMode == SendMode.Reliable) {
Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, reader.ReadBytes().Length);
+ Interlocked.Add(ref serverReliableBytesReceived, reader.Length);
using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
- writer.Write(messageData);
+ writer.WriteRaw(messageData, 0, messageData.Length);
using (Message reliableMessage = Message.Create(0, writer))
data.Client.SendMessage(reliableMessage, SendMode.Reliable);
@@ -1556,10 +1556,10 @@ public static void Server() {
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (data.SendMode == SendMode.Unreliable) {
Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, reader.ReadBytes().Length);
+ Interlocked.Add(ref serverUnreliableBytesReceived, reader.Length);
using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
- writer.Write(messageData);
+ writer.WriteRaw(messageData, 0, messageData.Length);
using (Message unreliableMessage = Message.Create(0, writer))
data.Client.SendMessage(unreliableMessage, SendMode.Unreliable);
@@ -1597,7 +1597,7 @@ await Task.Factory.StartNew(() => {
while (processActive) {
if (reliableToSend > 0) {
using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
- writer.Write(messageData);
+ writer.WriteRaw(messageData, 0, messageData.Length);
using (Message message = Message.Create(0, writer))
client.SendMessage(message, SendMode.Reliable);
@@ -1611,7 +1611,7 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
- writer.Write(messageData);
+ writer.WriteRaw(messageData, 0, messageData.Length);
using (Message message = Message.Create(0, writer))
client.SendMessage(message, SendMode.Unreliable);
@@ -1654,10 +1654,10 @@ await Task.Factory.StartNew(() => {
using (DarkRiftReader reader = message.GetReader()) {
if (data.SendMode == SendMode.Reliable) {
Interlocked.Increment(ref clientsReliableReceived);
- Interlocked.Add(ref clientsReliableBytesReceived, reader.ReadBytes().Length);
+ Interlocked.Add(ref clientsReliableBytesReceived, reader.Length);
} else if (data.SendMode == SendMode.Unreliable) {
Interlocked.Increment(ref clientsUnreliableReceived);
- Interlocked.Add(ref clientsUnreliableBytesReceived, reader.ReadBytes().Length);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, reader.Length);
}
}
}
From f83ae40e590a554b34ab94f5d1363668f5121d81 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Feb 2018 22:02:53 +0500
Subject: [PATCH 073/159] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 1f4d48b..62957d5 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@ Supported networking libraries:
- [Hazel](https://github.com/DarkRiftNetworking/Hazel-Networking "Hazel")
- [Photon](https://www.photonengine.com/en/OnPremise "Photon")
- [Neutrino](https://github.com/Claytonious/Neutrino)
+- [DarkRift](https://darkriftnetworking.com/DarkRift2)
You can find the latest benchmark results on the [wiki page](https://github.com/nxrighthere/BenchmarkNet/wiki/Benchmark-Results).
From af8752bde2142a3558a05fbe3102aad928d3ad58 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 27 Feb 2018 14:57:16 +0500
Subject: [PATCH 074/159] Add comments for blocks of variables
---
BenchmarkNet.cs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 09bb6b0..cc31052 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -55,8 +55,11 @@
namespace BenchmarkNet {
public class BenchmarkNet {
+ // Meta
protected const string title = "BenchmarkNet";
protected const string version = "1.06";
+
+ // Parameters
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
protected static ushort maxClients = 0;
@@ -65,18 +68,30 @@ public class BenchmarkNet {
protected static int sendRate = 0;
protected static int reliableMessages = 0;
protected static int unreliableMessages = 0;
+
+ // Data
protected static string message = String.Empty;
protected static char[] reversedMessage;
protected static byte[] messageData;
protected static byte[] reversedData;
+
+ // Status
protected static bool processActive = false;
protected static bool processCompleted = false;
protected static bool processOverload = false;
protected static bool processFailure = false;
+
+ // Modes
protected static bool instantMode = false;
protected static bool lowLatencyMode = false;
+
+ // Passes
protected static bool maxClientsPass = true;
+
+ // Threads
protected static Thread serverThread;
+
+ // Info
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
protected static volatile int clientsChannelsCount = 0;
@@ -97,12 +112,15 @@ public class BenchmarkNet {
protected static volatile int clientsUnreliableReceived = 0;
protected static volatile int clientsUnreliableBytesSent = 0;
protected static volatile int clientsUnreliableBytesReceived = 0;
+
+ // Internals
private static ushort maxPeers = 0;
private static byte selectedLibrary = 0;
private static readonly string[] networkingLibraries = {
"ENet",
"UNet",
"LiteNetLib",
+ "FastNetLib",
"Lidgren",
"MiniUDP",
"Hazel",
@@ -111,6 +129,7 @@ public class BenchmarkNet {
"DarkRift"
};
+ // Functions
private static Func Space = (value) => (String.Empty.PadRight(value));
private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
From c5c40ff6a644162711fcf50fd82fb836dce0be0d Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 27 Feb 2018 15:06:17 +0500
Subject: [PATCH 075/159] Remove whitespace
---
BenchmarkNet.cs | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index cc31052..e390085 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -58,7 +58,6 @@ public class BenchmarkNet {
// Meta
protected const string title = "BenchmarkNet";
protected const string version = "1.06";
-
// Parameters
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
@@ -68,29 +67,23 @@ public class BenchmarkNet {
protected static int sendRate = 0;
protected static int reliableMessages = 0;
protected static int unreliableMessages = 0;
-
// Data
protected static string message = String.Empty;
protected static char[] reversedMessage;
protected static byte[] messageData;
protected static byte[] reversedData;
-
// Status
protected static bool processActive = false;
protected static bool processCompleted = false;
protected static bool processOverload = false;
protected static bool processFailure = false;
-
// Modes
protected static bool instantMode = false;
protected static bool lowLatencyMode = false;
-
// Passes
protected static bool maxClientsPass = true;
-
// Threads
protected static Thread serverThread;
-
// Info
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
@@ -112,7 +105,6 @@ public class BenchmarkNet {
protected static volatile int clientsUnreliableReceived = 0;
protected static volatile int clientsUnreliableBytesSent = 0;
protected static volatile int clientsUnreliableBytesReceived = 0;
-
// Internals
private static ushort maxPeers = 0;
private static byte selectedLibrary = 0;
@@ -128,7 +120,6 @@ public class BenchmarkNet {
"Neutrino",
"DarkRift"
};
-
// Functions
private static Func Space = (value) => (String.Empty.PadRight(value));
private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
@@ -585,6 +576,7 @@ public static void Server() {
topology.ReceivedMessagePoolSize = ushort.MaxValue;
NetLibraryManager server = new NetLibraryManager(globalConfig);
+
int host = server.AddHost(topology, port, ip);
int hostID, connectionID, channelID, dataLength;
@@ -627,6 +619,7 @@ await Task.Factory.StartNew(() => {
int unreliableChannel = connectionConfig.AddChannel(QosType.UnreliableSequenced);
NetLibraryManager client = new NetLibraryManager();
+
int host = client.AddHost(new HostTopology(connectionConfig, 1), 0, null);
byte connectionError;
From 30a7a0c66d0cde5b01ada788fcbcbf867715b891 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 3 Mar 2018 14:27:50 +0500
Subject: [PATCH 076/159] Minor change of maxPeers value
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index e390085..39fe1d2 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -84,7 +84,7 @@ public class BenchmarkNet {
protected static bool maxClientsPass = true;
// Threads
protected static Thread serverThread;
- // Info
+ // Stats
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
protected static volatile int clientsChannelsCount = 0;
@@ -232,7 +232,7 @@ private static void Main(string[] arguments) {
if (selectedLibrary == 0)
ENet.Library.Initialize();
- maxPeers = ushort.MaxValue;
+ maxPeers = ushort.MaxValue - 1;
maxClientsPass = (selectedLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
if (!maxClientsPass)
From eb61a273f0491069f121e89686075d1176c9e258 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 4 Mar 2018 13:50:56 +0500
Subject: [PATCH 077/159] Remove unused string
---
BenchmarkNet.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 39fe1d2..ab62613 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -112,7 +112,6 @@ public class BenchmarkNet {
"ENet",
"UNet",
"LiteNetLib",
- "FastNetLib",
"Lidgren",
"MiniUDP",
"Hazel",
From be531090b77c3b4f9477480d660cff595a32d862 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 8 Mar 2018 18:42:50 +0500
Subject: [PATCH 078/159] Minor change of spinner
---
BenchmarkNet.cs | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ab62613..28be69a 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -274,9 +274,9 @@ await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
string[] strings = {
- String.Empty,
"Client" + (maxClients > 1 ? "s" : String.Empty),
- (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString()
+ (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString(),
+ Environment.NewLine + "Press any key to stop the process" + Space(1),
};
Stopwatch elapsedTime = new Stopwatch();
@@ -288,11 +288,11 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, 0);
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + Space(1) + strings[1].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(maxClients + Space(1) + strings[0].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("This networking library doesn't support more than " + strings[2] + " peers per server!");
+ Console.WriteLine("This networking library doesn't support more than " + strings[1] + " peers per server!");
Console.ResetColor();
}
@@ -303,12 +303,12 @@ await Task.Factory.StartNew(() => {
}
Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
- Console.WriteLine(strings[1] + " status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
+ Console.WriteLine(strings[0] + " status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
- Console.WriteLine(strings[1] + " sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
+ Console.WriteLine(strings[0] + " sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
- Console.WriteLine(strings[1] + " received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
+ Console.WriteLine(strings[0] + " received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
Console.WriteLine("Total - Reliable: " + ((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived) + " messages (" + ((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived) + " bytes), Unreliable: " + ((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived) + " messages (" + ((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived) + " bytes)");
Console.WriteLine("Expected - Reliable: " + (maxClients * (ulong)reliableMessages * 4) + " messages (" + (maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4) + " bytes), Unreliable: " + (maxClients * (ulong)unreliableMessages * 4) + " messages (" + (maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4) + " bytes)");
Console.WriteLine("Elapsed time: " + elapsedTime.Elapsed.Hours.ToString("00") + ":" + elapsedTime.Elapsed.Minutes.ToString("00") + ":" + elapsedTime.Elapsed.Seconds.ToString("00"));
@@ -321,17 +321,16 @@ await Task.Factory.StartNew(() => {
}
switch (spinnerSequence % 4) {
- case 0: strings[0] = "/";
+ case 0: Console.WriteLine(strings[2] + "/");
break;
- case 1: strings[0] = "—";
+ case 1: Console.WriteLine(strings[2] + "—");
break;
- case 2: strings[0] = "\\";
+ case 2: Console.WriteLine(strings[2] + "\\");
break;
- case 3: strings[0] = "|";
+ case 3: Console.WriteLine(strings[2] + "|");
break;
}
-
- Console.WriteLine(Environment.NewLine + "Press any key to stop the process " + strings[0]);
+
Thread.Sleep(15);
}
From 3719006bee0815e5dda931dbcc36b315d415bfdc Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 9 Mar 2018 14:42:54 +0500
Subject: [PATCH 079/159] Add a return to the initial GC mode after the process
is complete
---
BenchmarkNet.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 28be69a..828373d 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -108,6 +108,7 @@ public class BenchmarkNet {
// Internals
private static ushort maxPeers = 0;
private static byte selectedLibrary = 0;
+ private static GCLatencyMode initialGCMode;
private static readonly string[] networkingLibraries = {
"ENet",
"UNet",
@@ -225,8 +226,10 @@ private static void Main(string[] arguments) {
processActive = true;
- if (lowLatencyMode)
+ if (lowLatencyMode) {
+ initialGCMode = GCSettings.LatencyMode;
GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
+ }
if (selectedLibrary == 0)
ENet.Library.Initialize();
@@ -364,6 +367,9 @@ await Task.Factory.StartNew(() => {
Thread.Sleep(100);
processActive = false;
+ if (lowLatencyMode)
+ GCSettings.LatencyMode = initialGCMode;
+
break;
}
From fabe136437b14d783a37000707525403efa99dfd Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 9 Mar 2018 18:03:10 +0500
Subject: [PATCH 080/159] Remove trailing whitespace
---
BenchmarkNet.cs | 84 ++++++++++++++++++++++++-------------------------
1 file changed, 42 insertions(+), 42 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 828373d..e140f2a 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -123,7 +123,7 @@ public class BenchmarkNet {
// Functions
private static Func Space = (value) => (String.Empty.PadRight(value));
private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
-
+
private static void Main(string[] arguments) {
Console.Title = title;
@@ -141,13 +141,13 @@ private static void Main(string[] arguments) {
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
-
+
if (lowLatencyMode) {
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(Environment.NewLine + "The process will perform in Sustained Low Latency mode.");
Console.ResetColor();
}
-
+
Console.WriteLine(Environment.NewLine + "Select a networking library");
for (int i = 0; i < networkingLibraries.Length; i++) {
@@ -191,7 +191,7 @@ private static void Main(string[] arguments) {
Console.Write("Message (default " + defaultMessage.Length + " characters): ");
message = Console.ReadLine();
}
-
+
if (port == 0)
port = defaultPort;
@@ -223,7 +223,7 @@ private static void Main(string[] arguments) {
Console.CursorVisible = false;
Console.Clear();
-
+
processActive = true;
if (lowLatencyMode) {
@@ -262,7 +262,7 @@ private static void Main(string[] arguments) {
serverThread.Priority = ThreadPriority.AboveNormal;
serverThread.Start();
Thread.Sleep(100);
-
+
Task infoTask = Info();
Task superviseTask = Supervise();
Task spawnTask = Spawn();
@@ -292,7 +292,7 @@ await Task.Factory.StartNew(() => {
Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
Console.WriteLine(maxClients + Space(1) + strings[0].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
-
+
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("This networking library doesn't support more than " + strings[1] + " peers per server!");
@@ -333,7 +333,7 @@ await Task.Factory.StartNew(() => {
case 3: Console.WriteLine(strings[2] + "|");
break;
}
-
+
Thread.Sleep(15);
}
@@ -341,7 +341,7 @@ await Task.Factory.StartNew(() => {
Console.SetCursorPosition(0, Console.CursorTop - 1);
Console.WriteLine("Process completed! Press any key to exit...");
}
-
+
elapsedTime.Stop();
}, TaskCreationOptions.LongRunning);
}
@@ -372,7 +372,7 @@ await Task.Factory.StartNew(() => {
break;
}
-
+
lastData = currentData;
}
@@ -407,7 +407,7 @@ await Task.Factory.StartNew(() => {
clients[i] = NeutrinoBenchmark.Client();
else
clients[i] = DarkRiftBenchmark.Client();
-
+
Interlocked.Increment(ref clientsStartedCount);
Thread.Sleep(15);
}
@@ -431,7 +431,7 @@ private static void SendUnreliable(byte[] data, byte channelID, Peer peer) {
public static void Server() {
Host server = new Host();
server.Create(port, maxClients);
-
+
Event netEvent = new Event();
while (processActive) {
@@ -465,7 +465,7 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
Host client = new Host();
-
+
client.Create(null, 1);
Address address = new Address();
@@ -475,7 +475,7 @@ await Task.Factory.StartNew(() => {
Peer peer = client.Connect(address, 4, 0);
Event netEvent = new Event();
-
+
int reliableToSend = 0;
int unreliableToSend = 0;
int reliableSentCount = 0;
@@ -550,7 +550,7 @@ await Task.Factory.StartNew(() => {
Interlocked.Increment(ref clientsUnreliableReceived);
Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
}
-
+
netEvent.Packet.Dispose();
break;
@@ -575,12 +575,12 @@ public static void Server() {
int unreliableChannel = connectionConfig.AddChannel(QosType.UnreliableSequenced);
HostTopology topology = new HostTopology(connectionConfig, maxClients);
-
+
topology.SentMessagePoolSize = ushort.MaxValue;
topology.ReceivedMessagePoolSize = ushort.MaxValue;
NetLibraryManager server = new NetLibraryManager(globalConfig);
-
+
int host = server.AddHost(topology, port, ip);
int hostID, connectionID, channelID, dataLength;
@@ -596,13 +596,13 @@ public static void Server() {
if (channelID == 0) {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out error);
+ server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out error);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (channelID == 1) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, unreliableChannel, messageData, messageData.Length, out error);
+ server.Send(hostID, connectionID, unreliableChannel, messageData, messageData.Length, out error);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
}
@@ -618,14 +618,14 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
ConnectionConfig connectionConfig = new ConnectionConfig();
-
+
int reliableChannel = connectionConfig.AddChannel(QosType.ReliableSequenced);
int unreliableChannel = connectionConfig.AddChannel(QosType.UnreliableSequenced);
-
+
NetLibraryManager client = new NetLibraryManager();
-
+
int host = client.AddHost(new HostTopology(connectionConfig, 1), 0, null);
-
+
byte connectionError;
int connection = client.Connect(host, ip, port, 0, out connectionError);
@@ -640,9 +640,9 @@ await Task.Factory.StartNew(() => {
while (processActive) {
byte error;
-
+
if (reliableToSend > 0) {
- client.Send(host, connection, reliableChannel, messageData, messageData.Length, out error);
+ client.Send(host, connection, reliableChannel, messageData, messageData.Length, out error);
Interlocked.Decrement(ref reliableToSend);
Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
@@ -650,7 +650,7 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- client.Send(host, connection, unreliableChannel, messageData, messageData.Length, out error);
+ client.Send(host, connection, unreliableChannel, messageData, messageData.Length, out error);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
@@ -735,7 +735,7 @@ private static void SendUnreliable(byte[] data, LiteNetLib.NetPeer peer) {
public static void Server() {
EventBasedNetListener listener = new EventBasedNetListener();
NetManager server = new NetManager(listener, maxClients);
-
+
server.MergeEnabled = true;
server.Start(port);
@@ -773,7 +773,7 @@ public static async Task Client() {
await Task.Factory.StartNew(() => {
EventBasedNetListener listener = new EventBasedNetListener();
NetManager client = new NetManager(listener);
-
+
client.MergeEnabled = true;
client.Start();
client.Connect(ip, port, title + "Key");
@@ -871,7 +871,7 @@ private static void SendUnreliable(byte[] data, NetConnection connection, NetOut
public static void Server() {
NetPeerConfiguration config = new NetPeerConfiguration(title + "Config");
-
+
config.Port = port;
config.MaximumConnections = maxClients;
@@ -905,7 +905,7 @@ public static void Server() {
server.Recycle(netMessage);
}
-
+
Thread.Sleep(1000 / serverTickRate);
}
@@ -916,7 +916,7 @@ public static async Task Client() {
await Task.Factory.StartNew(() => {
NetPeerConfiguration config = new NetPeerConfiguration(title + "Config");
NetClient client = new NetClient(config);
-
+
client.Start();
client.Connect(ip, port);
@@ -1002,7 +1002,7 @@ await Task.Factory.StartNew(() => {
client.Recycle(netMessage);
}
-
+
Thread.Sleep(1000 / clientTickRate);
}
@@ -1010,13 +1010,13 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.LongRunning);
}
}
-
+
public class MiniUDPBenchmark : BenchmarkNet {
public static void Server() {
NetCore server = new NetCore(title, true);
server.Host(port);
-
+
server.PeerNotification += (peer, data, dataLength) => {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, dataLength);
@@ -1044,7 +1044,7 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
NetCore client = new NetCore(title, false);
-
+
MiniUDP.NetPeer connection = client.Connect(NetUtil.StringToEndPoint(ip + ":" + port), String.Empty);
int reliableToSend = 0;
@@ -1138,7 +1138,7 @@ public static void Server() {
if (data.SendOption == SendOption.Reliable) {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, data.Bytes.Length);
-
+
if (client.State == Hazel.ConnectionState.Connected) {
client.SendBytes(messageData, SendOption.Reliable);
Interlocked.Increment(ref serverReliableSent);
@@ -1330,7 +1330,7 @@ await Task.Factory.StartNew(() => {
PhotonPeer client = new PhotonPeer(listener, ConnectionProtocol.Udp);
client.Connect(ip + ":" + port, title);
-
+
int reliableToSend = 0;
int unreliableToSend = 0;
int reliableSentCount = 0;
@@ -1397,7 +1397,7 @@ await Task.Factory.StartNew(() => {
listener.OnUnreliableReceived += (data) => {
Interlocked.Increment(ref clientsUnreliableReceived);
Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
- };
+ };
while (processActive) {
client.Service();
@@ -1430,7 +1430,7 @@ public UnreliableMessage() {
public static void Server() {
Node server = new Node(port, typeof(NeutrinoBenchmark).Assembly);
-
+
server.OnReceived += (message) => {
NetworkPeer peer = message.Source;
@@ -1462,7 +1462,7 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
Node client = new Node(Task.CurrentId.ToString(), ip, port, typeof(NeutrinoBenchmark).Assembly);
-
+
int reliableToSend = 0;
int unreliableToSend = 0;
int reliableSentCount = 0;
@@ -1524,7 +1524,7 @@ await Task.Factory.StartNew(() => {
Interlocked.Exchange(ref reliableToSend, 0);
Interlocked.Exchange(ref unreliableToSend, 0);
};
-
+
client.OnReceived += (message) => {
if (message is ReliableMessage) {
ReliableMessage reliableMessage = message as ReliableMessage;
@@ -1598,7 +1598,7 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
DarkRiftClient client = new DarkRiftClient();
-
+
client.Connect(IPAddress.Parse(ip), port, IPVersion.IPv4);
int reliableToSend = 0;
From 3cb21b6a9a4f8c40f26457efbe0d4e32ed441bbc Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 9 Mar 2018 18:04:34 +0500
Subject: [PATCH 081/159] Minor function changes
---
BenchmarkNet.cs | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index e140f2a..09e49ae 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -121,8 +121,8 @@ public class BenchmarkNet {
"DarkRift"
};
// Functions
- private static Func Space = (value) => (String.Empty.PadRight(value));
- private static Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
+ private static readonly Func Space = (value) => (String.Empty.PadRight(value));
+ private static readonly Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
private static void Main(string[] arguments) {
Console.Title = title;
@@ -367,9 +367,6 @@ await Task.Factory.StartNew(() => {
Thread.Sleep(100);
processActive = false;
- if (lowLatencyMode)
- GCSettings.LatencyMode = initialGCMode;
-
break;
}
@@ -378,6 +375,9 @@ await Task.Factory.StartNew(() => {
if (selectedLibrary == 0)
ENet.Library.Deinitialize();
+
+ if (lowLatencyMode)
+ GCSettings.LatencyMode = initialGCMode;
}, TaskCreationOptions.LongRunning);
}
From b42e067bbc918a9d6dd9a2d00fb275557f3d4252 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Mar 2018 03:08:12 +0500
Subject: [PATCH 082/159] Minor refactoring
---
BenchmarkNet.cs | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 09e49ae..b44746c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -157,14 +157,14 @@ private static void Main(string[] arguments) {
Console.Write(Environment.NewLine + "Enter the number (default 0): ");
Byte.TryParse(Console.ReadLine(), out selectedLibrary);
- ushort defaultPort = 9500;
- ushort defaultMaxClients = 1000;
- int defaultServerTickRate = 64;
- int defaultClientTickRate = 64;
- int defaultSendRate = 15;
- int defaultReliableMessages = 500;
- int defaultUnreliableMessages = 1000;
- string defaultMessage = "Sometimes we just need a good networking library";
+ const ushort defaultPort = 9500;
+ const ushort defaultMaxClients = 1000;
+ const int defaultServerTickRate = 64;
+ const int defaultClientTickRate = 64;
+ const int defaultSendRate = 15;
+ const int defaultReliableMessages = 500;
+ const int defaultUnreliableMessages = 1000;
+ const string defaultMessage = "Sometimes we just need a good networking library";
if (!instantMode) {
Console.Write("Port (default " + defaultPort + "): ");
@@ -213,7 +213,7 @@ private static void Main(string[] arguments) {
if (unreliableMessages == 0)
unreliableMessages = defaultUnreliableMessages;
- if (message == String.Empty)
+ if (message.Length == 0)
message = defaultMessage;
reversedMessage = message.ToCharArray();
From 653227621c0b2e08c8a78484cba06ffdc5fdfd7b Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Mar 2018 19:49:39 +0500
Subject: [PATCH 083/159] Add GC mode indication
---
BenchmarkNet.cs | 36 +++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index b44746c..46cd7f4 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -57,7 +57,7 @@ namespace BenchmarkNet {
public class BenchmarkNet {
// Meta
protected const string title = "BenchmarkNet";
- protected const string version = "1.06";
+ protected const string version = "1.07";
// Parameters
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
@@ -139,6 +139,7 @@ private static void Main(string[] arguments) {
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
+
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
@@ -277,8 +278,12 @@ await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
string[] strings = {
- "Client" + (maxClients > 1 ? "s" : String.Empty),
- (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString(),
+ "Benchmarking " + networkingLibraries[selectedLibrary] + "...",
+ "Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
+ maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second",
+ "GC Mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server") + " GC",
+ "This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString() + " peers per server!",
+ Environment.NewLine + "The process is performing in Sustained Low Latency mode.",
Environment.NewLine + "Press any key to stop the process" + Space(1),
};
@@ -289,29 +294,30 @@ await Task.Factory.StartNew(() => {
while (processActive) {
Console.CursorVisible = false;
Console.SetCursorPosition(0, 0);
- Console.WriteLine("Benchmarking " + networkingLibraries[selectedLibrary] + "...");
- Console.WriteLine("Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)");
- Console.WriteLine(maxClients + Space(1) + strings[0].ToLower() + ", " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second");
+ Console.WriteLine(strings[0]);
+ Console.WriteLine(strings[1]);
+ Console.WriteLine(strings[2]);
+ Console.WriteLine(strings[3]);
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("This networking library doesn't support more than " + strings[1] + " peers per server!");
+ Console.WriteLine(strings[4]);
Console.ResetColor();
}
if (lowLatencyMode) {
Console.ForegroundColor = ConsoleColor.Yellow;
- Console.WriteLine(Environment.NewLine + "The process is performing in Sustained Low Latency mode.");
+ Console.WriteLine(strings[5]);
Console.ResetColor();
}
Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
- Console.WriteLine(strings[0] + " status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
+ Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
- Console.WriteLine(strings[0] + " sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
+ Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
- Console.WriteLine(strings[0] + " received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
+ Console.WriteLine("Clients received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
Console.WriteLine("Total - Reliable: " + ((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived) + " messages (" + ((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived) + " bytes), Unreliable: " + ((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived) + " messages (" + ((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived) + " bytes)");
Console.WriteLine("Expected - Reliable: " + (maxClients * (ulong)reliableMessages * 4) + " messages (" + (maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4) + " bytes), Unreliable: " + (maxClients * (ulong)unreliableMessages * 4) + " messages (" + (maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4) + " bytes)");
Console.WriteLine("Elapsed time: " + elapsedTime.Elapsed.Hours.ToString("00") + ":" + elapsedTime.Elapsed.Minutes.ToString("00") + ":" + elapsedTime.Elapsed.Seconds.ToString("00"));
@@ -324,13 +330,13 @@ await Task.Factory.StartNew(() => {
}
switch (spinnerSequence % 4) {
- case 0: Console.WriteLine(strings[2] + "/");
+ case 0: Console.WriteLine(strings[6] + "/");
break;
- case 1: Console.WriteLine(strings[2] + "—");
+ case 1: Console.WriteLine(strings[6] + "—");
break;
- case 2: Console.WriteLine(strings[2] + "\\");
+ case 2: Console.WriteLine(strings[6] + "\\");
break;
- case 3: Console.WriteLine(strings[2] + "|");
+ case 3: Console.WriteLine(strings[6] + "|");
break;
}
From 260647cd0dbd026588a1a1ab657a36155324326a Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Mar 2018 19:56:49 +0500
Subject: [PATCH 084/159] Minor change of output text
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 46cd7f4..9692d2c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -313,7 +313,7 @@ await Task.Factory.StartNew(() => {
Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
- Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (predicted)" + Space(10));
+ Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (eventual)" + Space(10));
Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
From bf2d71cff0afa3021de5c170c380cfdb8ca4c7aa Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Mar 2018 20:35:04 +0500
Subject: [PATCH 085/159] Minor change of system messages
---
BenchmarkNet.cs | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 9692d2c..7d1956f 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -281,9 +281,9 @@ await Task.Factory.StartNew(() => {
"Benchmarking " + networkingLibraries[selectedLibrary] + "...",
"Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second",
- "GC Mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server") + " GC",
+ "GC mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server") + " GC",
"This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString() + " peers per server!",
- Environment.NewLine + "The process is performing in Sustained Low Latency mode.",
+ "The process is performing in Sustained Low Latency mode.",
Environment.NewLine + "Press any key to stop the process" + Space(1),
};
@@ -299,6 +299,9 @@ await Task.Factory.StartNew(() => {
Console.WriteLine(strings[2]);
Console.WriteLine(strings[3]);
+ if (!maxClientsPass || lowLatencyMode)
+ Console.WriteLine();
+
if (!maxClientsPass) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(strings[4]);
From 09511270aee1c0c449ffe67b46b5e410dd044928 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 10 Mar 2018 21:57:01 +0500
Subject: [PATCH 086/159] Improve overload detection
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7d1956f..732eac1 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -368,7 +368,7 @@ await Task.Factory.StartNew(() => {
if (currentData == 0) {
processFailure = true;
} else {
- if (((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
+ if (clientsDisconnectedCount > 1 || ((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
processOverload = true;
}
From 0690fa9259306b82852fd56602f60b6ba736d020 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 11 Mar 2018 04:30:24 +0500
Subject: [PATCH 087/159] Update README.md
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 62957d5..ac2a58d 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,8 @@ Usage
--------
Run the application and enter the desired parameters to override the default values. Do not perform any actions while the benchmark is running and wait until the process is complete.
+When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) to the Workstation GC.
+
You can use packet sniffer to monitor how the data is transmitted, but it may affect the results.
If you want to simulate a bad network condition, use [Clumsy](http://jagt.github.io/clumsy/ "Clumsy") as an ideal companion.
From afb5913812616baf8c46cdec1ecf96aa6bd4a34a Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 11 Mar 2018 05:02:54 +0500
Subject: [PATCH 088/159] Minor change of variable for initial GC latency mode
---
BenchmarkNet.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 732eac1..ea76902 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -108,7 +108,7 @@ public class BenchmarkNet {
// Internals
private static ushort maxPeers = 0;
private static byte selectedLibrary = 0;
- private static GCLatencyMode initialGCMode;
+ private static GCLatencyMode initGCLatencyMode;
private static readonly string[] networkingLibraries = {
"ENet",
"UNet",
@@ -228,7 +228,7 @@ private static void Main(string[] arguments) {
processActive = true;
if (lowLatencyMode) {
- initialGCMode = GCSettings.LatencyMode;
+ initGCLatencyMode = GCSettings.LatencyMode;
GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
}
@@ -386,7 +386,7 @@ await Task.Factory.StartNew(() => {
ENet.Library.Deinitialize();
if (lowLatencyMode)
- GCSettings.LatencyMode = initialGCMode;
+ GCSettings.LatencyMode = initGCLatencyMode;
}, TaskCreationOptions.LongRunning);
}
From fdd46b5bf2cbcd40e8440062666ff91edd5712a3 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 11 Mar 2018 05:20:28 +0500
Subject: [PATCH 089/159] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index ac2a58d..74a9772 100644
--- a/README.md
+++ b/README.md
@@ -33,9 +33,9 @@ Usage
--------
Run the application and enter the desired parameters to override the default values. Do not perform any actions while the benchmark is running and wait until the process is complete.
-When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) to the Workstation GC.
+When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) from Server GC to Workstation GC.
-You can use packet sniffer to monitor how the data is transmitted, but it may affect the results.
+You can use any packet sniffer to monitor how the data is transmitted, but it may affect the results.
If you want to simulate a bad network condition, use [Clumsy](http://jagt.github.io/clumsy/ "Clumsy") as an ideal companion.
From 66e62993bd6ff2a48226b41f17390a7b3c19ad36 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 11 Mar 2018 12:20:47 +0500
Subject: [PATCH 090/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 74a9772..827a06f 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ Usage
--------
Run the application and enter the desired parameters to override the default values. Do not perform any actions while the benchmark is running and wait until the process is complete.
-When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) from Server GC to Workstation GC.
+When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) from Server GC to Workstation GC. You can find more information in [this article](https://blogs.msdn.microsoft.com/seteplia/2017/01/05/understanding-different-gc-modes-with-concurrency-visualizer/) about how different GC modes are working.
You can use any packet sniffer to monitor how the data is transmitted, but it may affect the results.
From 21938f891283825b17312c9dbe436594c5937299 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 13 Mar 2018 15:43:16 +0500
Subject: [PATCH 091/159] Minor change of Stopwatch initialization
---
BenchmarkNet.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ea76902..f8e65dc 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -287,9 +287,7 @@ await Task.Factory.StartNew(() => {
Environment.NewLine + "Press any key to stop the process" + Space(1),
};
- Stopwatch elapsedTime = new Stopwatch();
-
- elapsedTime.Start();
+ Stopwatch elapsedTime = Stopwatch.StartNew();
while (processActive) {
Console.CursorVisible = false;
From d6fab63e6ffbed9f052ceeae5d500be8917e4064 Mon Sep 17 00:00:00 2001
From: Stas
Date: Sat, 17 Mar 2018 03:24:03 +0500
Subject: [PATCH 092/159] Minor change for ENet
---
BenchmarkNet.cs | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f8e65dc..f960ab5 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -436,8 +436,12 @@ private static void SendUnreliable(byte[] data, byte channelID, Peer peer) {
}
public static void Server() {
- Host server = new Host();
- server.Create(port, maxClients);
+ Host server = new Host();
+ Address address = new Address();
+
+ address.Port = port;
+
+ server.Create(address, maxClients, 4);
Event netEvent = new Event();
@@ -472,14 +476,13 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
Host client = new Host();
-
- client.Create(null, 1);
-
Address address = new Address();
address.SetHost(ip);
address.Port = port;
+ client.Create(null, 1);
+
Peer peer = client.Connect(address, 4, 0);
Event netEvent = new Event();
From b66ae2e1215db16a115b91f573fec46833b37870 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 18 Mar 2018 20:47:13 +0500
Subject: [PATCH 093/159] Minor change of main class
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f960ab5..6928423 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -53,8 +53,8 @@
using DarkRift.Server;
using DarkRift.Client;
-namespace BenchmarkNet {
- public class BenchmarkNet {
+namespace NX {
+ public abstract class BenchmarkNet {
// Meta
protected const string title = "BenchmarkNet";
protected const string version = "1.07";
From a5e6e4422172948c376c25736d7f093683f6a6a1 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 23 Mar 2018 06:43:47 +0500
Subject: [PATCH 094/159] Refactor of spinner
---
BenchmarkNet.cs | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 6928423..864a668 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -277,6 +277,12 @@ private static async Task Info() {
await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
+ string[] spinner = {
+ "/",
+ "—",
+ "\\",
+ "|"
+ };
string[] strings = {
"Benchmarking " + networkingLibraries[selectedLibrary] + "...",
"Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
@@ -284,9 +290,12 @@ await Task.Factory.StartNew(() => {
"GC mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server") + " GC",
"This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString() + " peers per server!",
"The process is performing in Sustained Low Latency mode.",
- Environment.NewLine + "Press any key to stop the process" + Space(1),
};
+ for (int i = 0; i < spinner.Length; i++) {
+ spinner[i] = Environment.NewLine + "Press any key to stop the process" + Space(1) + spinner[i];
+ }
+
Stopwatch elapsedTime = Stopwatch.StartNew();
while (processActive) {
@@ -331,13 +340,13 @@ await Task.Factory.StartNew(() => {
}
switch (spinnerSequence % 4) {
- case 0: Console.WriteLine(strings[6] + "/");
+ case 0: Console.WriteLine(spinner[0]);
break;
- case 1: Console.WriteLine(strings[6] + "—");
+ case 1: Console.WriteLine(spinner[1]);
break;
- case 2: Console.WriteLine(strings[6] + "\\");
+ case 2: Console.WriteLine(spinner[2]);
break;
- case 3: Console.WriteLine(strings[6] + "|");
+ case 3: Console.WriteLine(spinner[3]);
break;
}
From b35f76321007fb42a86e0b81f3e9f56cfdd61afa Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 25 Mar 2018 09:03:24 +0500
Subject: [PATCH 095/159] Minor change of elapsed time measurement
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 864a668..5b7b5df 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -353,12 +353,12 @@ await Task.Factory.StartNew(() => {
Thread.Sleep(15);
}
+ elapsedTime.Stop();
+
if (!processActive && processCompleted) {
Console.SetCursorPosition(0, Console.CursorTop - 1);
Console.WriteLine("Process completed! Press any key to exit...");
}
-
- elapsedTime.Stop();
}, TaskCreationOptions.LongRunning);
}
From 964f76fb894024088a57f290bd43411bc67020f6 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 25 Mar 2018 18:39:12 +0500
Subject: [PATCH 096/159] Minor change for ENet
---
BenchmarkNet.cs | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 5b7b5df..86a2952 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -459,17 +459,15 @@ public static void Server() {
switch (netEvent.Type) {
case EventType.Receive:
- byte[] data = netEvent.Packet.GetBytes();
-
if (netEvent.ChannelID == 2) {
Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
+ Interlocked.Add(ref serverReliableBytesReceived, netEvent.Packet.Length);
SendReliable(messageData, 0, netEvent.Peer);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (netEvent.ChannelID == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
+ Interlocked.Add(ref serverUnreliableBytesReceived, netEvent.Packet.Length);
SendUnreliable(messageData, 1, netEvent.Peer);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
@@ -560,14 +558,12 @@ await Task.Factory.StartNew(() => {
break;
case EventType.Receive:
- byte[] data = netEvent.Packet.GetBytes();
-
if (netEvent.ChannelID == 0) {
Interlocked.Increment(ref clientsReliableReceived);
- Interlocked.Add(ref clientsReliableBytesReceived, data.Length);
+ Interlocked.Add(ref clientsReliableBytesReceived, netEvent.Packet.Length);
} else if (netEvent.ChannelID == 1) {
Interlocked.Increment(ref clientsUnreliableReceived);
- Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, netEvent.Packet.Length);
}
netEvent.Packet.Dispose();
From e462db00ba3a012557ead0a5bf93fdd35212da74 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 25 Mar 2018 18:45:06 +0500
Subject: [PATCH 097/159] Minor change for LiteNetLib
---
BenchmarkNet.cs | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 86a2952..22588bd 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -759,17 +759,15 @@ public static void Server() {
};
listener.NetworkReceiveEvent += (peer, reader, deliveryMethod) => {
- byte[] data = reader.Data;
-
if (deliveryMethod == DeliveryMethod.ReliableOrdered) {
Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
+ Interlocked.Add(ref serverReliableBytesReceived, reader.AvailableBytes);
SendReliable(messageData, peer);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (deliveryMethod == DeliveryMethod.Sequenced) {
Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
+ Interlocked.Add(ref serverUnreliableBytesReceived, reader.AvailableBytes);
SendUnreliable(messageData, peer);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
@@ -852,14 +850,12 @@ await Task.Factory.StartNew(() => {
};
listener.NetworkReceiveEvent += (peer, reader, deliveryMethod) => {
- byte[] data = reader.Data;
-
if (deliveryMethod == DeliveryMethod.ReliableOrdered) {
Interlocked.Increment(ref clientsReliableReceived);
- Interlocked.Add(ref clientsReliableBytesReceived, data.Length);
+ Interlocked.Add(ref clientsReliableBytesReceived, reader.AvailableBytes);
} else if (deliveryMethod == DeliveryMethod.Sequenced) {
Interlocked.Increment(ref clientsUnreliableReceived);
- Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, reader.AvailableBytes);
}
};
From 6b1adaa93af82492e2cd0039e6f680e490155467 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 26 Mar 2018 12:56:59 +0500
Subject: [PATCH 098/159] Minor change for Lidgren
---
BenchmarkNet.cs | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 22588bd..69be479 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -895,17 +895,15 @@ public static void Server() {
while ((netMessage = server.ReadMessage()) != null) {
switch (netMessage.MessageType) {
case NetIncomingMessageType.Data:
- byte[] data = netMessage.ReadBytes(netMessage.LengthBytes);
-
if (netMessage.SequenceChannel == 2) {
Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
+ Interlocked.Add(ref serverReliableBytesReceived, netMessage.LengthBytes);
SendReliable(messageData, netMessage.SenderConnection, server.CreateMessage(), 0);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (netMessage.SequenceChannel == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
+ Interlocked.Add(ref serverUnreliableBytesReceived, netMessage.LengthBytes);
SendUnreliable(messageData, netMessage.SenderConnection, server.CreateMessage(), 1);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
@@ -998,14 +996,12 @@ await Task.Factory.StartNew(() => {
break;
case NetIncomingMessageType.Data:
- byte[] data = netMessage.ReadBytes(netMessage.LengthBytes);
-
if (netMessage.SequenceChannel == 0) {
Interlocked.Increment(ref clientsReliableReceived);
- Interlocked.Add(ref clientsReliableBytesReceived, data.Length);
+ Interlocked.Add(ref clientsReliableBytesReceived, netMessage.LengthBytes);
} else if (netMessage.SequenceChannel == 1) {
Interlocked.Increment(ref clientsUnreliableReceived);
- Interlocked.Add(ref clientsUnreliableBytesReceived, data.Length);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, netMessage.LengthBytes);
}
break;
From d17bec24ba26da70c462c7f244085f725fb131b8 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 26 Mar 2018 13:51:39 +0500
Subject: [PATCH 099/159] Replace string concatenation with StringBuilder
---
BenchmarkNet.cs | 29 +++++++++++++++++++----------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 69be479..497ece7 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -283,6 +283,12 @@ await Task.Factory.StartNew(() => {
"\\",
"|"
};
+ string[] status = {
+ "Running" + Space(2),
+ "Failure" + Space(2),
+ "Overload" + Space(1),
+ "Completed"
+ };
string[] strings = {
"Benchmarking " + networkingLibraries[selectedLibrary] + "...",
"Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
@@ -297,6 +303,7 @@ await Task.Factory.StartNew(() => {
}
Stopwatch elapsedTime = Stopwatch.StartNew();
+ StringBuilder info = new StringBuilder(1024);
while (processActive) {
Console.CursorVisible = false;
@@ -321,16 +328,18 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
- Console.WriteLine(Environment.NewLine + "Server status: " + (processFailure || !serverThread.IsAlive ? "Failure" + Space(2) : (processOverload ? "Overload" + Space(1) : (processCompleted ? "Completed" : "Running" + Space(2)))));
- Console.WriteLine("Clients status: " + clientsStartedCount + " started, " + clientsConnectedCount + " connected, " + clientsDisconnectedCount + " dropped");
- Console.WriteLine("Server payload flow: " + PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00") + " mbps (current), " + PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00") + " mbps (eventual)" + Space(10));
- Console.WriteLine("Clients sent -> Reliable: " + clientsReliableSent + " messages (" + clientsReliableBytesSent + " bytes), Unreliable: " + clientsUnreliableSent + " messages (" + clientsUnreliableBytesSent + " bytes)");
- Console.WriteLine("Server received <- Reliable: " + serverReliableReceived + " messages (" + serverReliableBytesReceived + " bytes), Unreliable: " + serverUnreliableReceived + " messages (" + serverUnreliableBytesReceived + " bytes)");
- Console.WriteLine("Server sent -> Reliable: " + serverReliableSent + " messages (" + serverReliableBytesSent + " bytes), Unreliable: " + serverUnreliableSent + " messages (" + serverUnreliableBytesSent + " bytes)");
- Console.WriteLine("Clients received <- Reliable: " + clientsReliableReceived + " messages (" + clientsReliableBytesReceived + " bytes), Unreliable: " + clientsUnreliableReceived + " messages (" + clientsUnreliableBytesReceived + " bytes)");
- Console.WriteLine("Total - Reliable: " + ((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived) + " messages (" + ((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived) + " bytes), Unreliable: " + ((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived) + " messages (" + ((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived) + " bytes)");
- Console.WriteLine("Expected - Reliable: " + (maxClients * (ulong)reliableMessages * 4) + " messages (" + (maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4) + " bytes), Unreliable: " + (maxClients * (ulong)unreliableMessages * 4) + " messages (" + (maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4) + " bytes)");
- Console.WriteLine("Elapsed time: " + elapsedTime.Elapsed.Hours.ToString("00") + ":" + elapsedTime.Elapsed.Minutes.ToString("00") + ":" + elapsedTime.Elapsed.Seconds.ToString("00"));
+ info.Clear();
+ info.AppendLine().Append("Server status: ").Append((processFailure || !serverThread.IsAlive ? status[1] : (processOverload ? status[2] : (processCompleted ? status[3] : status[0]))));
+ info.AppendLine().Append("Clients status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
+ info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps (current), ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps (eventual)").Append(Space(10));
+ info.AppendLine().Append("Clients sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
+ info.AppendLine().Append("Server received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)");
+ info.AppendLine().Append("Server sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)");
+ info.AppendLine().Append("Clients received <- Reliable: ").Append(clientsReliableReceived).Append(" messages (").Append(clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append(clientsUnreliableReceived).Append(" messages (").Append(clientsUnreliableBytesReceived).Append(" bytes)");
+ info.AppendLine().Append("Total - Reliable: ").Append((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived).Append(" messages (").Append((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived).Append(" messages (").Append((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived).Append(" bytes)");
+ info.AppendLine().Append("Expected - Reliable: ").Append(maxClients * (ulong)reliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4).Append(" bytes), Unreliable: ").Append(maxClients * (ulong)unreliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4).Append(" bytes)");
+ info.AppendLine().Append("Elapsed time: ").Append(elapsedTime.Elapsed.Hours.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Minutes.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Seconds.ToString("00"));
+ Console.WriteLine(info);
if (spinnerTimer >= 10) {
spinnerSequence++;
From ceee15e88425b6d43dc4079e726c68754cd473fe Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 26 Mar 2018 14:11:50 +0500
Subject: [PATCH 100/159] Minor change in the order of variables declaration
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 497ece7..2e712d3 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -302,8 +302,8 @@ await Task.Factory.StartNew(() => {
spinner[i] = Environment.NewLine + "Press any key to stop the process" + Space(1) + spinner[i];
}
- Stopwatch elapsedTime = Stopwatch.StartNew();
StringBuilder info = new StringBuilder(1024);
+ Stopwatch elapsedTime = Stopwatch.StartNew();
while (processActive) {
Console.CursorVisible = false;
From 2f3b5fbbf58abb48710aaad02510a83ad75b9c2e Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 26 Mar 2018 23:40:31 +0500
Subject: [PATCH 101/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 827a06f..8eda73c 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,7 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of their networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
+This project has already had an impact and helped developers in an improvement of networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
or [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
Bitcoin `173ZRNuT4k7ss7rAVmNCZr6hLfFY4DZubU` Litecoin `LhdxsS7AUhUrKMmMyTX1yL4EQp6tzSonDT`
From ccfaa0c0de603ff108b09d6a3660aab10c0d210f Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 28 Mar 2018 19:54:13 +0500
Subject: [PATCH 102/159] Minor cleanup and formatting
---
BenchmarkNet.cs | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 2e712d3..ecd10c1 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -19,7 +19,7 @@
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
-*/
+ */
using System;
using System.Diagnostics;
@@ -57,7 +57,7 @@ namespace NX {
public abstract class BenchmarkNet {
// Meta
protected const string title = "BenchmarkNet";
- protected const string version = "1.07";
+ protected const string version = "1.08";
// Parameters
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
@@ -139,7 +139,7 @@ private static void Main(string[] arguments) {
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
-
+
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
@@ -347,7 +347,6 @@ await Task.Factory.StartNew(() => {
} else {
spinnerTimer++;
}
-
switch (spinnerSequence % 4) {
case 0: Console.WriteLine(spinner[0]);
break;
@@ -381,12 +380,10 @@ await Task.Factory.StartNew(() => {
decimal currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
if (currentData == lastData) {
- if (currentData == 0) {
+ if (currentData == 0)
processFailure = true;
- } else {
- if (clientsDisconnectedCount > 1 || ((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
- processOverload = true;
- }
+ else if (clientsDisconnectedCount > 1 || ((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
+ processOverload = true;
processCompleted = true;
Thread.Sleep(100);
@@ -454,7 +451,7 @@ private static void SendUnreliable(byte[] data, byte channelID, Peer peer) {
}
public static void Server() {
- Host server = new Host();
+ Host server = new Host();
Address address = new Address();
address.Port = port;
@@ -465,7 +462,6 @@ public static void Server() {
while (processActive) {
server.Service(1000 / serverTickRate, out netEvent);
-
switch (netEvent.Type) {
case EventType.Receive:
if (netEvent.ChannelID == 2) {
@@ -550,7 +546,6 @@ await Task.Factory.StartNew(() => {
while (processActive) {
client.Service(1000 / clientTickRate, out netEvent);
-
switch (netEvent.Type) {
case EventType.Connect:
Interlocked.Increment(ref clientsConnectedCount);
@@ -1432,7 +1427,9 @@ public ReliableMessage() {
}
[MsgPack.Serialization.MessagePackMember(0)]
- public string Message { get; set; }
+ public string Message {
+ get; set;
+ }
}
private class UnreliableMessage : NetworkMessage {
@@ -1441,7 +1438,9 @@ public UnreliableMessage() {
}
[MsgPack.Serialization.MessagePackMember(0)]
- public string Message { get; set; }
+ public string Message {
+ get; set;
+ }
}
public static void Server() {
From e6dcdc6436415b404e34308ee277d12f6f1f05f3 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 29 Mar 2018 15:18:45 +0500
Subject: [PATCH 103/159] Minor refactoring
---
BenchmarkNet.cs | 80 +++++++++++++++++++++++++------------------------
1 file changed, 41 insertions(+), 39 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ecd10c1..a7dd15d 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -87,7 +87,7 @@ public abstract class BenchmarkNet {
// Stats
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
- protected static volatile int clientsChannelsCount = 0;
+ protected static volatile int clientsStreamsCount = 0;
protected static volatile int clientsDisconnectedCount = 0;
protected static volatile int serverReliableSent = 0;
protected static volatile int serverReliableReceived = 0;
@@ -122,7 +122,7 @@ public abstract class BenchmarkNet {
};
// Functions
private static readonly Func Space = (value) => (String.Empty.PadRight(value));
- private static readonly Func PayloadFlow = (clientsChannelsCount, messageLength, sendRate) => (clientsChannelsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
+ private static readonly Func PayloadFlow = (clientsStreamsCount, messageLength, sendRate) => (clientsStreamsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
private static void Main(string[] arguments) {
Console.Title = title;
@@ -331,7 +331,7 @@ await Task.Factory.StartNew(() => {
info.Clear();
info.AppendLine().Append("Server status: ").Append((processFailure || !serverThread.IsAlive ? status[1] : (processOverload ? status[2] : (processCompleted ? status[3] : status[0]))));
info.AppendLine().Append("Clients status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
- info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsChannelsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps (current), ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps (eventual)").Append(Space(10));
+ info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(Space(10));
info.AppendLine().Append("Clients sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
info.AppendLine().Append("Server received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)");
info.AppendLine().Append("Server sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)");
@@ -440,12 +440,14 @@ await Task.Factory.StartNew(() => {
public class ENetBenchmark : BenchmarkNet {
private static void SendReliable(byte[] data, byte channelID, Peer peer) {
Packet packet = new Packet();
+
packet.Create(data, 0, data.Length, PacketFlags.Reliable); // Reliable Sequenced
peer.Send(channelID, packet);
}
private static void SendUnreliable(byte[] data, byte channelID, Peer peer) {
Packet packet = new Packet();
+
packet.Create(data, 0, data.Length, PacketFlags.None); // Unreliable Sequenced
peer.Send(channelID, packet);
}
@@ -526,18 +528,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -678,18 +680,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -823,18 +825,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -961,18 +963,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -1086,18 +1088,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -1213,18 +1215,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -1370,18 +1372,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -1510,18 +1512,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
@@ -1656,18 +1658,18 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0 && !reliableIncremented) {
reliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (reliableToSend == 0 && reliableIncremented) {
reliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
if (unreliableToSend > 0 && !unreliableIncremented) {
unreliableIncremented = true;
- Interlocked.Increment(ref clientsChannelsCount);
+ Interlocked.Increment(ref clientsStreamsCount);
} else if (unreliableToSend == 0 && unreliableIncremented) {
unreliableIncremented = false;
- Interlocked.Decrement(ref clientsChannelsCount);
+ Interlocked.Decrement(ref clientsStreamsCount);
}
await Task.Delay(1000 / sendRate);
From 600554cd345ef16255d0d732442af9533fbf15ee Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 3 Apr 2018 22:17:59 +0500
Subject: [PATCH 104/159] Add sealed modifier to library classes
---
BenchmarkNet.cs | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index a7dd15d..8c0d304 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -347,6 +347,7 @@ await Task.Factory.StartNew(() => {
} else {
spinnerTimer++;
}
+
switch (spinnerSequence % 4) {
case 0: Console.WriteLine(spinner[0]);
break;
@@ -437,7 +438,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class ENetBenchmark : BenchmarkNet {
+ public sealed class ENetBenchmark : BenchmarkNet {
private static void SendReliable(byte[] data, byte channelID, Peer peer) {
Packet packet = new Packet();
@@ -464,6 +465,7 @@ public static void Server() {
while (processActive) {
server.Service(1000 / serverTickRate, out netEvent);
+
switch (netEvent.Type) {
case EventType.Receive:
if (netEvent.ChannelID == 2) {
@@ -548,6 +550,7 @@ await Task.Factory.StartNew(() => {
while (processActive) {
client.Service(1000 / clientTickRate, out netEvent);
+
switch (netEvent.Type) {
case EventType.Connect:
Interlocked.Increment(ref clientsConnectedCount);
@@ -583,7 +586,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class UNetBenchmark : BenchmarkNet {
+ public sealed class UNetBenchmark : BenchmarkNet {
public static void Server() {
GlobalConfig globalConfig = new GlobalConfig();
@@ -744,7 +747,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class LiteNetLibBenchmark : BenchmarkNet {
+ public sealed class LiteNetLibBenchmark : BenchmarkNet {
private static void SendReliable(byte[] data, LiteNetLib.NetPeer peer) {
peer.Send(data, DeliveryMethod.ReliableOrdered); // Reliable Ordered (https://github.com/RevenantX/LiteNetLib/issues/68)
}
@@ -875,7 +878,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class LidgrenBenchmark : BenchmarkNet {
+ public sealed class LidgrenBenchmark : BenchmarkNet {
private static void SendReliable(byte[] data, NetConnection connection, NetOutgoingMessage netMessage, int channelID) {
netMessage.Write(data);
connection.SendMessage(netMessage, NetDeliveryMethod.ReliableSequenced, channelID);
@@ -1024,7 +1027,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class MiniUDPBenchmark : BenchmarkNet {
+ public sealed class MiniUDPBenchmark : BenchmarkNet {
public static void Server() {
NetCore server = new NetCore(title, true);
@@ -1138,7 +1141,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class HazelBenchmark : BenchmarkNet {
+ public sealed class HazelBenchmark : BenchmarkNet {
public static void Server() {
UdpConnectionListener server = new UdpConnectionListener(new NetworkEndPoint(ip, port));
@@ -1269,7 +1272,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class PhotonBenchmark : BenchmarkNet {
+ public sealed class PhotonBenchmark : BenchmarkNet {
private class PhotonPeerListener : IPhotonPeerListener {
public event Action OnConnected;
public event Action OnDisconnected;
@@ -1422,7 +1425,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class NeutrinoBenchmark : BenchmarkNet {
+ public sealed class NeutrinoBenchmark : BenchmarkNet {
private class ReliableMessage : NetworkMessage {
public ReliableMessage() {
IsGuaranteed = true;
@@ -1564,7 +1567,7 @@ await Task.Factory.StartNew(() => {
}
}
- public class DarkRiftBenchmark : BenchmarkNet {
+ public sealed class DarkRiftBenchmark : BenchmarkNet {
public static void Server() {
DarkRiftServer server = new DarkRiftServer(new ServerSpawnData(IPAddress.Parse(ip), port, IPVersion.IPv4));
From 53928b40595deb892358e3ce76ce8e17567cd6d4 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 4 Apr 2018 16:59:08 +0500
Subject: [PATCH 105/159] Add new debugging options
---
BenchmarkNet.cs | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 8c0d304..1b68859 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -80,6 +80,9 @@ public abstract class BenchmarkNet {
// Modes
protected static bool instantMode = false;
protected static bool lowLatencyMode = false;
+ // Debug
+ protected static bool disableInfo = false;
+ protected static bool disableSupervisor = false;
// Passes
protected static bool maxClientsPass = true;
// Threads
@@ -135,6 +138,12 @@ private static void Main(string[] arguments) {
if (argument == "-lowlatency")
lowLatencyMode = true;
+
+ if (argument == "-disable-info")
+ disableInfo = true;
+
+ if (argument == "-disable-supervisor")
+ disableSupervisor = true;
}
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
@@ -264,8 +273,8 @@ private static void Main(string[] arguments) {
serverThread.Start();
Thread.Sleep(100);
- Task infoTask = Info();
- Task superviseTask = Supervise();
+ Task infoTask = disableInfo ? null : Info();
+ Task superviseTask = disableSupervisor ? null : Supervise();
Task spawnTask = Spawn();
Console.ReadKey();
From b01e80c99e7af3dd0e5641ec30c22658c605ebb2 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 4 Apr 2018 18:05:16 +0500
Subject: [PATCH 106/159] Minor change to unreliable data
---
BenchmarkNet.cs | 62 ++++++++++++++++++++++++-------------------------
1 file changed, 31 insertions(+), 31 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 1b68859..f39a6cd 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -486,9 +486,9 @@ public static void Server() {
} else if (netEvent.ChannelID == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, netEvent.Packet.Length);
- SendUnreliable(messageData, 1, netEvent.Peer);
+ SendUnreliable(reversedData, 1, netEvent.Peer);
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
netEvent.Packet.Dispose();
@@ -530,11 +530,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- SendUnreliable(messageData, 3, peer);
+ SendUnreliable(reversedData, 3, peer);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
@@ -635,9 +635,9 @@ public static void Server() {
} else if (channelID == 1) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, unreliableChannel, messageData, messageData.Length, out error);
+ server.Send(hostID, connectionID, unreliableChannel, reversedData, reversedData.Length, out error);
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
break;
@@ -683,11 +683,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- client.Send(host, connection, unreliableChannel, messageData, messageData.Length, out error);
+ client.Send(host, connection, unreliableChannel, reversedData, reversedData.Length, out error);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
@@ -786,9 +786,9 @@ public static void Server() {
} else if (deliveryMethod == DeliveryMethod.Sequenced) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, reader.AvailableBytes);
- SendUnreliable(messageData, peer);
+ SendUnreliable(reversedData, peer);
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
};
@@ -828,11 +828,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- SendUnreliable(messageData, client.GetFirstPeer());
+ SendUnreliable(reversedData, client.GetFirstPeer());
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
@@ -922,9 +922,9 @@ public static void Server() {
} else if (netMessage.SequenceChannel == 3) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, netMessage.LengthBytes);
- SendUnreliable(messageData, netMessage.SenderConnection, server.CreateMessage(), 1);
+ SendUnreliable(reversedData, netMessage.SenderConnection, server.CreateMessage(), 1);
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
break;
@@ -966,11 +966,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- SendUnreliable(messageData, client.ServerConnection, client.CreateMessage(), 3);
+ SendUnreliable(reversedData, client.ServerConnection, client.CreateMessage(), 3);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
@@ -1053,9 +1053,9 @@ public static void Server() {
server.PeerPayload += (peer, data, dataLength) => {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
- peer.SendPayload(messageData, (ushort)messageData.Length);
+ peer.SendPayload(reversedData, (ushort)reversedData.Length);
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
};
while (processActive) {
@@ -1091,11 +1091,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- connection.SendPayload(messageData, (ushort)messageData.Length);
+ connection.SendPayload(reversedData, (ushort)reversedData.Length);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
@@ -1174,9 +1174,9 @@ public static void Server() {
Interlocked.Add(ref serverUnreliableBytesReceived, data.Bytes.Length);
if (client.State == Hazel.ConnectionState.Connected) {
- client.SendBytes(messageData, SendOption.None);
+ client.SendBytes(reversedData, SendOption.None);
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
}
@@ -1218,11 +1218,11 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- client.SendBytes(messageData, SendOption.None);
+ client.SendBytes(reversedData, SendOption.None);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
@@ -1476,7 +1476,7 @@ public static void Server() {
Interlocked.Add(ref serverUnreliableBytesReceived, unreliableMessage.Message.Length);
peer.SendNetworkMessage(server.GetMessage());
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
};
@@ -1603,15 +1603,15 @@ public static void Server() {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, reader.Length);
- using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
- writer.WriteRaw(messageData, 0, messageData.Length);
+ using (DarkRiftWriter writer = DarkRiftWriter.Create(reversedData.Length)) {
+ writer.WriteRaw(reversedData, 0, reversedData.Length);
using (Message unreliableMessage = Message.Create(0, writer))
data.Client.SendMessage(unreliableMessage, SendMode.Unreliable);
}
Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
}
}
@@ -1655,8 +1655,8 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- using (DarkRiftWriter writer = DarkRiftWriter.Create(messageData.Length)) {
- writer.WriteRaw(messageData, 0, messageData.Length);
+ using (DarkRiftWriter writer = DarkRiftWriter.Create(reversedData.Length)) {
+ writer.WriteRaw(reversedData, 0, reversedData.Length);
using (Message message = Message.Create(0, writer))
client.SendMessage(message, SendMode.Unreliable);
@@ -1665,7 +1665,7 @@ await Task.Factory.StartNew(() => {
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, messageData.Length);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
if (reliableToSend > 0 && !reliableIncremented) {
From 6a0669a1e52fd789d52ad814abd739ceefc6031e Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 5 Apr 2018 21:06:38 +0500
Subject: [PATCH 107/159] Add validation of the selected networking library
---
BenchmarkNet.cs | 51 ++++++++++++++++++++++++++++++-------------------
1 file changed, 31 insertions(+), 20 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f39a6cd..4fbcdb2 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -146,6 +146,7 @@ private static void Main(string[] arguments) {
disableSupervisor = true;
}
+ Start:
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
@@ -167,6 +168,35 @@ private static void Main(string[] arguments) {
Console.Write(Environment.NewLine + "Enter the number (default 0): ");
Byte.TryParse(Console.ReadLine(), out selectedLibrary);
+ if (selectedLibrary == 0)
+ serverThread = new Thread(ENetBenchmark.Server);
+ else if (selectedLibrary == 1)
+ serverThread = new Thread(UNetBenchmark.Server);
+ else if (selectedLibrary == 2)
+ serverThread = new Thread(LiteNetLibBenchmark.Server);
+ else if (selectedLibrary == 3)
+ serverThread = new Thread(LidgrenBenchmark.Server);
+ else if (selectedLibrary == 4)
+ serverThread = new Thread(MiniUDPBenchmark.Server);
+ else if (selectedLibrary == 5)
+ serverThread = new Thread(HazelBenchmark.Server);
+ else if (selectedLibrary == 6)
+ serverThread = new Thread(PhotonBenchmark.Server);
+ else if (selectedLibrary == 7)
+ serverThread = new Thread(NeutrinoBenchmark.Server);
+ else if (selectedLibrary == 8)
+ serverThread = new Thread(DarkRiftBenchmark.Server);
+
+ if (serverThread == null) {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("Please, enter a valid number of the networking library!");
+ Console.ReadKey();
+ Console.ResetColor();
+ Console.Clear();
+
+ goto Start;
+ }
+
const ushort defaultPort = 9500;
const ushort defaultMaxClients = 1000;
const int defaultServerTickRate = 64;
@@ -250,25 +280,6 @@ private static void Main(string[] arguments) {
if (!maxClientsPass)
maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedLibrary > 0 ? maxPeers : (ushort)ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
- if (selectedLibrary == 0)
- serverThread = new Thread(ENetBenchmark.Server);
- else if (selectedLibrary == 1)
- serverThread = new Thread(UNetBenchmark.Server);
- else if (selectedLibrary == 2)
- serverThread = new Thread(LiteNetLibBenchmark.Server);
- else if (selectedLibrary == 3)
- serverThread = new Thread(LidgrenBenchmark.Server);
- else if (selectedLibrary == 4)
- serverThread = new Thread(MiniUDPBenchmark.Server);
- else if (selectedLibrary == 5)
- serverThread = new Thread(HazelBenchmark.Server);
- else if (selectedLibrary == 6)
- serverThread = new Thread(PhotonBenchmark.Server);
- else if (selectedLibrary == 7)
- serverThread = new Thread(NeutrinoBenchmark.Server);
- else
- serverThread = new Thread(DarkRiftBenchmark.Server);
-
serverThread.Priority = ThreadPriority.AboveNormal;
serverThread.Start();
Thread.Sleep(100);
@@ -437,7 +448,7 @@ await Task.Factory.StartNew(() => {
clients[i] = PhotonBenchmark.Client();
else if (selectedLibrary == 7)
clients[i] = NeutrinoBenchmark.Client();
- else
+ else if (selectedLibrary == 8)
clients[i] = DarkRiftBenchmark.Client();
Interlocked.Increment(ref clientsStartedCount);
From 3d9f49d5c38b7fa25dd76d22c5b366c7808db9bf Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 7 Apr 2018 16:43:22 +0500
Subject: [PATCH 108/159] Minor cleanup and reordering
---
BenchmarkNet.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 4fbcdb2..b65ef78 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -146,8 +146,9 @@ private static void Main(string[] arguments) {
disableSupervisor = true;
}
- Start:
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
+
+ Start:
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
@@ -193,7 +194,7 @@ private static void Main(string[] arguments) {
Console.ReadKey();
Console.ResetColor();
Console.Clear();
-
+
goto Start;
}
@@ -1591,8 +1592,6 @@ public sealed class DarkRiftBenchmark : BenchmarkNet {
public static void Server() {
DarkRiftServer server = new DarkRiftServer(new ServerSpawnData(IPAddress.Parse(ip), port, IPVersion.IPv4));
- server.Start();
-
server.ClientManager.ClientConnected += (peer, netEvent) => {
netEvent.Client.MessageReceived += (sender, data) => {
using (Message message = data.GetMessage()) {
@@ -1629,6 +1628,8 @@ public static void Server() {
};
};
+ server.Start();
+
while (processActive) {
server.ExecuteDispatcherTasks();
Thread.Sleep(1000 / serverTickRate);
From 94065d40fb2551fb0dc92a19f135b53a5763a779 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 7 Apr 2018 17:03:16 +0500
Subject: [PATCH 109/159] Remove redundant variable declarations
---
BenchmarkNet.cs | 34 ++++++++++------------------------
1 file changed, 10 insertions(+), 24 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index b65ef78..a670748 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -482,10 +482,8 @@ public static void Server() {
server.Create(address, maxClients, 4);
- Event netEvent = new Event();
-
while (processActive) {
- server.Service(1000 / serverTickRate, out netEvent);
+ server.Service(1000 / serverTickRate, out Event netEvent);
switch (netEvent.Type) {
case EventType.Receive:
@@ -521,7 +519,6 @@ await Task.Factory.StartNew(() => {
client.Create(null, 1);
Peer peer = client.Connect(address, 4, 0);
- Event netEvent = new Event();
int reliableToSend = 0;
int unreliableToSend = 0;
@@ -570,7 +567,7 @@ await Task.Factory.StartNew(() => {
}, TaskCreationOptions.AttachedToParent);
while (processActive) {
- client.Service(1000 / clientTickRate, out netEvent);
+ client.Service(1000 / clientTickRate, out Event netEvent);
switch (netEvent.Type) {
case EventType.Connect:
@@ -628,26 +625,23 @@ public static void Server() {
int host = server.AddHost(topology, port, ip);
- int hostID, connectionID, channelID, dataLength;
byte[] buffer = new byte[1024];
NetworkEventType netEvent;
while (processActive) {
- byte error;
-
- while ((netEvent = server.Receive(out hostID, out connectionID, out channelID, buffer, buffer.Length, out dataLength, out error)) != NetworkEventType.Nothing) {
+ while ((netEvent = server.Receive(out int hostID, out int connectionID, out int channelID, buffer, buffer.Length, out int dataLength, out byte netError)) != NetworkEventType.Nothing) {
switch (netEvent) {
case NetworkEventType.DataEvent:
if (channelID == 0) {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out error);
+ server.Send(hostID, connectionID, reliableChannel, messageData, messageData.Length, out byte sendError);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (channelID == 1) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, dataLength);
- server.Send(hostID, connectionID, unreliableChannel, reversedData, reversedData.Length, out error);
+ server.Send(hostID, connectionID, unreliableChannel, reversedData, reversedData.Length, out byte sendError);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
@@ -671,8 +665,7 @@ await Task.Factory.StartNew(() => {
int host = client.AddHost(new HostTopology(connectionConfig, 1), 0, null);
- byte connectionError;
- int connection = client.Connect(host, ip, port, 0, out connectionError);
+ int connection = client.Connect(host, ip, port, 0, out byte connectionError);
int reliableToSend = 0;
int unreliableToSend = 0;
@@ -684,10 +677,8 @@ await Task.Factory.StartNew(() => {
bool unreliableIncremented = false;
while (processActive) {
- byte error;
-
if (reliableToSend > 0) {
- client.Send(host, connection, reliableChannel, messageData, messageData.Length, out error);
+ client.Send(host, connection, reliableChannel, messageData, messageData.Length, out byte sendError);
Interlocked.Decrement(ref reliableToSend);
Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
@@ -695,7 +686,7 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- client.Send(host, connection, unreliableChannel, reversedData, reversedData.Length, out error);
+ client.Send(host, connection, unreliableChannel, reversedData, reversedData.Length, out byte sendError);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
@@ -722,14 +713,11 @@ await Task.Factory.StartNew(() => {
}
}, TaskCreationOptions.AttachedToParent);
- int hostID, connectionID, channelID, dataLength;
byte[] buffer = new byte[1024];
NetworkEventType netEvent;
while (processActive) {
- byte error;
-
- while ((netEvent = client.Receive(out hostID, out connectionID, out channelID, buffer, buffer.Length, out dataLength, out error)) != NetworkEventType.Nothing) {
+ while ((netEvent = client.Receive(out int hostID, out int connectionID, out int channelID, buffer, buffer.Length, out int dataLength, out byte error)) != NetworkEventType.Nothing) {
switch (netEvent) {
case NetworkEventType.ConnectEvent:
Interlocked.Increment(ref clientsConnectedCount);
@@ -761,9 +749,7 @@ await Task.Factory.StartNew(() => {
Thread.Sleep(1000 / clientTickRate);
}
- byte disconnectError;
-
- client.Disconnect(host, connection, out disconnectError);
+ client.Disconnect(host, connection, out byte disconnectError);
}, TaskCreationOptions.LongRunning);
}
}
From 542d4252f9b65f3f77af48a4a18ec6698ca9af88 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 8 Apr 2018 19:21:17 +0500
Subject: [PATCH 110/159] Minor reordering
---
BenchmarkNet.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index a670748..a20104c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -717,7 +717,7 @@ await Task.Factory.StartNew(() => {
NetworkEventType netEvent;
while (processActive) {
- while ((netEvent = client.Receive(out int hostID, out int connectionID, out int channelID, buffer, buffer.Length, out int dataLength, out byte error)) != NetworkEventType.Nothing) {
+ while ((netEvent = client.Receive(out int hostID, out int connectionID, out int channelID, buffer, buffer.Length, out int dataLength, out byte netError)) != NetworkEventType.Nothing) {
switch (netEvent) {
case NetworkEventType.ConnectEvent:
Interlocked.Increment(ref clientsConnectedCount);
@@ -1152,8 +1152,6 @@ public sealed class HazelBenchmark : BenchmarkNet {
public static void Server() {
UdpConnectionListener server = new UdpConnectionListener(new NetworkEndPoint(ip, port));
- server.Start();
-
server.NewConnection += (peer, netEvent) => {
netEvent.Connection.DataReceived += (sender, data) => {
Connection client = (Connection)sender;
@@ -1184,6 +1182,8 @@ public static void Server() {
netEvent.Recycle();
};
+ server.Start();
+
while (processActive) {
Thread.Sleep(1000 / serverTickRate);
}
From 1e6e54b8e08af73059cbcdf4704831e35c783b76 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 13 Apr 2018 22:09:35 +0500
Subject: [PATCH 111/159] Fix clients drop for Neutrino
---
BenchmarkNet.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index a20104c..7486f83 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -664,7 +664,6 @@ await Task.Factory.StartNew(() => {
NetLibraryManager client = new NetLibraryManager();
int host = client.AddHost(new HostTopology(connectionConfig, 1), 0, null);
-
int connection = client.Connect(host, ip, port, 0, out byte connectionError);
int reliableToSend = 0;
@@ -1458,6 +1457,8 @@ public string Message {
public static void Server() {
Node server = new Node(port, typeof(NeutrinoBenchmark).Assembly);
+ NeutrinoConfig.PeerTimeoutMillis = 120000;
+
server.OnReceived += (message) => {
NetworkPeer peer = message.Source;
From f8289edf2f44dc59bfd92da6dc02cc0b1819aa79 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 13 Apr 2018 23:14:46 +0500
Subject: [PATCH 112/159] Remove redundant functions for LiteNetLib
---
BenchmarkNet.cs | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7486f83..8508152 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -754,14 +754,6 @@ await Task.Factory.StartNew(() => {
}
public sealed class LiteNetLibBenchmark : BenchmarkNet {
- private static void SendReliable(byte[] data, LiteNetLib.NetPeer peer) {
- peer.Send(data, DeliveryMethod.ReliableOrdered); // Reliable Ordered (https://github.com/RevenantX/LiteNetLib/issues/68)
- }
-
- private static void SendUnreliable(byte[] data, LiteNetLib.NetPeer peer) {
- peer.Send(data, DeliveryMethod.Sequenced); // Unreliable Sequenced
- }
-
public static void Server() {
EventBasedNetListener listener = new EventBasedNetListener();
NetManager server = new NetManager(listener, maxClients);
@@ -777,13 +769,13 @@ public static void Server() {
if (deliveryMethod == DeliveryMethod.ReliableOrdered) {
Interlocked.Increment(ref serverReliableReceived);
Interlocked.Add(ref serverReliableBytesReceived, reader.AvailableBytes);
- SendReliable(messageData, peer);
+ peer.Send(messageData, DeliveryMethod.ReliableOrdered);
Interlocked.Increment(ref serverReliableSent);
Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
} else if (deliveryMethod == DeliveryMethod.Sequenced) {
Interlocked.Increment(ref serverUnreliableReceived);
Interlocked.Add(ref serverUnreliableBytesReceived, reader.AvailableBytes);
- SendUnreliable(reversedData, peer);
+ peer.Send(reversedData, DeliveryMethod.Sequenced);
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
@@ -806,6 +798,8 @@ await Task.Factory.StartNew(() => {
client.Start();
client.Connect(ip, port, title + "Key");
+ LiteNetLib.NetPeer connection = client.GetFirstPeer();
+
int reliableToSend = 0;
int unreliableToSend = 0;
int reliableSentCount = 0;
@@ -817,7 +811,7 @@ await Task.Factory.StartNew(() => {
while (processActive) {
if (reliableToSend > 0) {
- SendReliable(messageData, client.GetFirstPeer());
+ connection.Send(messageData, DeliveryMethod.ReliableOrdered);
Interlocked.Decrement(ref reliableToSend);
Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
@@ -825,7 +819,7 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- SendUnreliable(reversedData, client.GetFirstPeer());
+ connection.Send(reversedData, DeliveryMethod.Sequenced);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
From 7c57bcb972137a00baa100614ac481eb2361db1b Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 14 Apr 2018 03:42:26 +0500
Subject: [PATCH 113/159] Minor change of output text
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 8508152..ba491f7 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -314,7 +314,7 @@ await Task.Factory.StartNew(() => {
"Benchmarking " + networkingLibraries[selectedLibrary] + "...",
"Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second",
- "GC mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server") + " GC",
+ "GC mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server"),
"This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString() + " peers per server!",
"The process is performing in Sustained Low Latency mode.",
};
From da2b366d6fd6a9feffb75ab1e8977ed482332fee Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Mon, 16 Apr 2018 11:16:03 +0500
Subject: [PATCH 114/159] Minor refactoring
---
BenchmarkNet.cs | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ba491f7..b504713 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -57,7 +57,7 @@ namespace NX {
public abstract class BenchmarkNet {
// Meta
protected const string title = "BenchmarkNet";
- protected const string version = "1.08";
+ protected const string version = "1.09";
// Parameters
protected const string ip = "127.0.0.1";
protected static ushort port = 0;
@@ -148,7 +148,7 @@ private static void Main(string[] arguments) {
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
- Start:
+Start:
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
@@ -298,6 +298,7 @@ private static async Task Info() {
await Task.Factory.StartNew(() => {
int spinnerTimer = 0;
int spinnerSequence = 0;
+ string space = Space(10);
string[] spinner = {
"/",
"—",
@@ -352,7 +353,7 @@ await Task.Factory.StartNew(() => {
info.Clear();
info.AppendLine().Append("Server status: ").Append((processFailure || !serverThread.IsAlive ? status[1] : (processOverload ? status[2] : (processCompleted ? status[3] : status[0]))));
info.AppendLine().Append("Clients status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
- info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(Space(10));
+ info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(space);
info.AppendLine().Append("Clients sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
info.AppendLine().Append("Server received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)");
info.AppendLine().Append("Server sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)");
@@ -394,12 +395,13 @@ await Task.Factory.StartNew(() => {
private static async Task Supervise() {
await Task.Factory.StartNew(() => {
+ decimal currentData = 0;
decimal lastData = 0;
while (processActive) {
Thread.Sleep(1000);
- decimal currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
+ currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
if (currentData == lastData) {
if (currentData == 0)
From 2ad308fe546d495e9dcdcce17ac21652df6869fa Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 17 Apr 2018 15:03:25 +0500
Subject: [PATCH 115/159] Add peer timeout calculation for Neutrino
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index b504713..06fe014 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -148,7 +148,7 @@ private static void Main(string[] arguments) {
Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
-Start:
+ Start:
Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
@@ -1453,7 +1453,7 @@ public string Message {
public static void Server() {
Node server = new Node(port, typeof(NeutrinoBenchmark).Assembly);
- NeutrinoConfig.PeerTimeoutMillis = 120000;
+ NeutrinoConfig.PeerTimeoutMillis = ((Math.Max(reliableMessages, unreliableMessages) / sendRate) * 2) * 1000;
server.OnReceived += (message) => {
NetworkPeer peer = message.Source;
From b64570442006301f5c4549b6593879de03483bae Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 18 Apr 2018 09:28:26 +0500
Subject: [PATCH 116/159] Add parameters calculation for UNet
---
BenchmarkNet.cs | 43 ++++++++++++++++++++++++++++++++++++-------
1 file changed, 36 insertions(+), 7 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 06fe014..2fa684f 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -610,23 +610,32 @@ public sealed class UNetBenchmark : BenchmarkNet {
public static void Server() {
GlobalConfig globalConfig = new GlobalConfig();
- globalConfig.ReactorMaximumSentMessages = 0;
- globalConfig.ReactorMaximumReceivedMessages = 0;
+ globalConfig.ThreadPoolSize = 4;
+ globalConfig.ThreadAwakeTimeout = (uint)serverTickRate;
+ globalConfig.MaxHosts = 1;
+ globalConfig.MaxPacketSize = (ushort)((messageData.Length * 2) + 32);
+ globalConfig.ReactorMaximumSentMessages = (ushort)((reliableMessages + unreliableMessages) * sendRate);;
+ globalConfig.ReactorMaximumReceivedMessages = (ushort)((reliableMessages + unreliableMessages) * sendRate);;
ConnectionConfig connectionConfig = new ConnectionConfig();
int reliableChannel = connectionConfig.AddChannel(QosType.ReliableSequenced);
int unreliableChannel = connectionConfig.AddChannel(QosType.UnreliableSequenced);
+ connectionConfig.SendDelay = 1;
+ connectionConfig.MinUpdateTimeout = 1;
+ connectionConfig.PingTimeout = 2000;
+ connectionConfig.DisconnectTimeout = 5000;
+ connectionConfig.PacketSize = (ushort)((messageData.Length * 2) + 32);
+
HostTopology topology = new HostTopology(connectionConfig, maxClients);
- topology.SentMessagePoolSize = ushort.MaxValue;
- topology.ReceivedMessagePoolSize = ushort.MaxValue;
+ topology.SentMessagePoolSize = (ushort)((reliableMessages + unreliableMessages) * sendRate);
+ topology.ReceivedMessagePoolSize = (ushort)((reliableMessages + unreliableMessages) * sendRate);
NetLibraryManager server = new NetLibraryManager(globalConfig);
int host = server.AddHost(topology, port, ip);
-
byte[] buffer = new byte[1024];
NetworkEventType netEvent;
@@ -658,14 +667,34 @@ public static void Server() {
public static async Task Client() {
await Task.Factory.StartNew(() => {
+ GlobalConfig globalConfig = new GlobalConfig();
+
+ globalConfig.ThreadPoolSize = 1;
+ globalConfig.ThreadAwakeTimeout = (uint)clientTickRate;
+ globalConfig.MaxHosts = 1;
+ globalConfig.MaxPacketSize = (ushort)((messageData.Length * 2) + 32);
+ globalConfig.ReactorMaximumSentMessages = (ushort)(sendRate / 2);
+ globalConfig.ReactorMaximumReceivedMessages = (ushort)(sendRate / 2);
+
ConnectionConfig connectionConfig = new ConnectionConfig();
int reliableChannel = connectionConfig.AddChannel(QosType.ReliableSequenced);
int unreliableChannel = connectionConfig.AddChannel(QosType.UnreliableSequenced);
- NetLibraryManager client = new NetLibraryManager();
+ connectionConfig.SendDelay = 1;
+ connectionConfig.MinUpdateTimeout = 1;
+ connectionConfig.PingTimeout = 2000;
+ connectionConfig.DisconnectTimeout = 5000;
+ connectionConfig.PacketSize = (ushort)((messageData.Length * 2) + 32);
+
+ HostTopology topology = new HostTopology(connectionConfig, 1);
+
+ topology.SentMessagePoolSize = (ushort)(sendRate / 2);
+ topology.ReceivedMessagePoolSize = (ushort)(sendRate / 2);
+
+ NetLibraryManager client = new NetLibraryManager(globalConfig);
- int host = client.AddHost(new HostTopology(connectionConfig, 1), 0, null);
+ int host = client.AddHost(topology, 0, null);
int connection = client.Connect(host, ip, port, 0, out byte connectionError);
int reliableToSend = 0;
From f72c23ac9c459c9544fccf6d168fb654dab6470f Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 15 Jul 2018 17:55:53 +0500
Subject: [PATCH 117/159] Add libraries version info
---
BenchmarkNet.cs | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 2fa684f..ab77d2d 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -29,26 +29,26 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-// ENet (https://github.com/lsalzman/enet) C# Wrapper (https://github.com/NateShoffner/ENetSharp)
+// ENet 1.3.13 (https://github.com/lsalzman/enet) C# Wrapper (https://github.com/NateShoffner/ENetSharp)
using ENet;
-// UNet (https://docs.unity3d.com/Manual/UNetUsingTransport.html)
+// UNet 1.0.0.9 (https://forum.unity.com/threads/standalone-library-binaries-aka-server-dll.526718)
using UnetServerDll;
-// LiteNetLib (https://github.com/RevenantX/LiteNetLib)
+// LiteNetLib 0.8 (https://github.com/RevenantX/LiteNetLib)
using LiteNetLib;
using LiteNetLib.Utils;
-// Lidgren (https://github.com/lidgren/lidgren-network-gen3)
+// Lidgren 1.7.0 (https://github.com/lidgren/lidgren-network-gen3)
using Lidgren.Network;
-// MiniUDP (https://github.com/ashoulson/MiniUDP)
+// MiniUDP 0.8.5 (https://github.com/ashoulson/MiniUDP)
using MiniUDP;
-// Hazel (https://github.com/DarkRiftNetworking/Hazel-Networking)
+// Hazel 0.1.2 (https://github.com/DarkRiftNetworking/Hazel-Networking)
using Hazel;
using Hazel.Udp;
-// Photon (https://www.photonengine.com/en/OnPremise)
+// Photon 4.0.29 (https://www.photonengine.com/en/OnPremise)
using ExitGames.Client.Photon;
-// Neutrino (https://github.com/Claytonious/Neutrino)
+// Neutrino 1.0 (https://github.com/Claytonious/Neutrino)
using Neutrino.Core;
using Neutrino.Core.Messages;
-// DarkRift (https://darkriftnetworking.com/DarkRift2)
+// DarkRift 2.1.2 (https://darkriftnetworking.com/DarkRift2)
using DarkRift;
using DarkRift.Server;
using DarkRift.Client;
From f255988c1e98a3522c44c478c62d88e4278ce2a3 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 15 Jul 2018 17:56:28 +0500
Subject: [PATCH 118/159] Minor change for LiteNetLib
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index ab77d2d..6685b59 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -787,7 +787,7 @@ await Task.Factory.StartNew(() => {
public sealed class LiteNetLibBenchmark : BenchmarkNet {
public static void Server() {
EventBasedNetListener listener = new EventBasedNetListener();
- NetManager server = new NetManager(listener, maxClients);
+ NetManager server = new NetManager(listener);
server.MergeEnabled = true;
server.Start(port);
From d04e0708d289208004ffb567d2f529e6bb389da8 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 15 Jul 2018 19:32:41 +0500
Subject: [PATCH 119/159] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 8eda73c..c5126c1 100644
--- a/README.md
+++ b/README.md
@@ -8,13 +8,13 @@ BenchmarkNet is a console application for testing the reliable UDP networking so
Features:
- Asynchronous simulation of a large number of clients
-- Stable under high loads
+- Stable under high-loads
- Simple and flexible simulation setup
- Detailed session information
Supported networking libraries:
- [ENet](https://github.com/lsalzman/enet "ENet") ([C# Wrapper](https://github.com/NateShoffner/ENetSharp "C# Wrapper"))
-- [UNet](https://docs.unity3d.com/Manual/UNetUsingTransport.html "UNet")
+- [UNet](https://forum.unity.com/threads/standalone-library-binaries-aka-server-dll.526718 "UNet")
- [LiteNetLib](https://github.com/RevenantX/LiteNetLib "LiteNetLib")
- [Lidgren](https://github.com/lidgren/lidgren-network-gen3 "Lidgren")
- [MiniUDP](https://github.com/ashoulson/MiniUDP "MiniUDP")
@@ -47,7 +47,7 @@ If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "
Donations
--------
-This project has already had an impact and helped developers in an improvement of networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
+This project has already had an impact and helped developers in an improvement of the networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
or [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
Bitcoin `173ZRNuT4k7ss7rAVmNCZr6hLfFY4DZubU` Litecoin `LhdxsS7AUhUrKMmMyTX1yL4EQp6tzSonDT`
From 47053957b07c0b5e26d9c452ba6c06afb9e88794 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 21 Jul 2018 20:01:48 +0500
Subject: [PATCH 120/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c5126c1..0ac7c9c 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ You can find the latest benchmark results on the [wiki page](https://github.com/
How it works?
--------
-Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which works independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
+Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which work independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
Usage
--------
From e39ffa9c1aab2c2d045569457a48295c3f8b544b Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 27 Jul 2018 23:25:24 +0500
Subject: [PATCH 121/159] Improve detection of initial failure in the Supervise
task
---
BenchmarkNet.cs | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 6685b59..c3928c8 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -397,17 +397,27 @@ private static async Task Supervise() {
await Task.Factory.StartNew(() => {
decimal currentData = 0;
decimal lastData = 0;
+ bool recollectData = true;
while (processActive) {
Thread.Sleep(1000);
+ Collect:
currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
if (currentData == lastData) {
- if (currentData == 0)
+ if (currentData == 0) {
+ if (recollectData) {
+ recollectData = false;
+ Thread.Sleep(4000);
+
+ goto Collect;
+ }
+
processFailure = true;
- else if (clientsDisconnectedCount > 1 || ((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90)
+ } else if (clientsDisconnectedCount > 1 || ((currentData / (maxClients * ((decimal)reliableMessages + (decimal)unreliableMessages) * 4)) * 100) < 90) {
processOverload = true;
+ }
processCompleted = true;
Thread.Sleep(100);
From fdac09e948b82e225fab4db5f38bef4b5cf00a43 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 28 Jul 2018 00:08:23 +0500
Subject: [PATCH 122/159] Minor change of variables
---
BenchmarkNet.cs | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index c3928c8..7141798 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -68,25 +68,21 @@ public abstract class BenchmarkNet {
protected static int reliableMessages = 0;
protected static int unreliableMessages = 0;
// Data
- protected static string message = String.Empty;
+ protected static string message;
protected static char[] reversedMessage;
protected static byte[] messageData;
protected static byte[] reversedData;
- // Status
- protected static bool processActive = false;
- protected static bool processCompleted = false;
- protected static bool processOverload = false;
- protected static bool processFailure = false;
// Modes
protected static bool instantMode = false;
protected static bool lowLatencyMode = false;
// Debug
protected static bool disableInfo = false;
protected static bool disableSupervisor = false;
- // Passes
- protected static bool maxClientsPass = true;
- // Threads
- protected static Thread serverThread;
+ // Status
+ protected static bool processActive = false;
+ protected static bool processCompleted = false;
+ protected static bool processOverload = false;
+ protected static bool processFailure = false;
// Stats
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
@@ -109,8 +105,10 @@ public abstract class BenchmarkNet {
protected static volatile int clientsUnreliableBytesSent = 0;
protected static volatile int clientsUnreliableBytesReceived = 0;
// Internals
- private static ushort maxPeers = 0;
private static byte selectedLibrary = 0;
+ private static ushort maxPeers = 0;
+ private static bool maxClientsPass = true;
+ private static Thread serverThread;
private static GCLatencyMode initGCLatencyMode;
private static readonly string[] networkingLibraries = {
"ENet",
From d3571a1897fc1444b492d9cc3c91a1b92a9efda0 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 28 Jul 2018 20:03:00 +0500
Subject: [PATCH 123/159] Improve detection of server thread failure
---
BenchmarkNet.cs | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7141798..7b85786 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -81,8 +81,9 @@ public abstract class BenchmarkNet {
// Status
protected static bool processActive = false;
protected static bool processCompleted = false;
- protected static bool processOverload = false;
+ protected static bool processCrashed = false;
protected static bool processFailure = false;
+ protected static bool processOverload = false;
// Stats
protected static volatile int clientsStartedCount = 0;
protected static volatile int clientsConnectedCount = 0;
@@ -305,6 +306,7 @@ await Task.Factory.StartNew(() => {
};
string[] status = {
"Running" + Space(2),
+ "Crashed" + Space(2),
"Failure" + Space(2),
"Overload" + Space(1),
"Completed"
@@ -349,7 +351,7 @@ await Task.Factory.StartNew(() => {
}
info.Clear();
- info.AppendLine().Append("Server status: ").Append((processFailure || !serverThread.IsAlive ? status[1] : (processOverload ? status[2] : (processCompleted ? status[3] : status[0]))));
+ info.AppendLine().Append("Server status: ").Append(processCrashed ? status[1] : (processFailure ? status[2] : (processOverload ? status[3] : (processCompleted ? status[4] : status[0]))));
info.AppendLine().Append("Clients status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(space);
info.AppendLine().Append("Clients sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
@@ -403,6 +405,9 @@ await Task.Factory.StartNew(() => {
Collect:
currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
+ if (!serverThread.IsAlive)
+ processCrashed = true;
+
if (currentData == lastData) {
if (currentData == 0) {
if (recollectData) {
From 5fb0cd6b4067c9f519dc740571699e2e941affac Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 12 Aug 2018 08:12:23 +0500
Subject: [PATCH 124/159] Minor fix for instant mode
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7b85786..2ee7891 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -68,7 +68,7 @@ public abstract class BenchmarkNet {
protected static int reliableMessages = 0;
protected static int unreliableMessages = 0;
// Data
- protected static string message;
+ protected static string message = String.Empty;
protected static char[] reversedMessage;
protected static byte[] messageData;
protected static byte[] reversedData;
From 6900d30e737fc9c50aad3084fb858cd93ed3ab86 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 26 Aug 2018 11:30:19 +0500
Subject: [PATCH 125/159] Remove redundant semicolons
---
BenchmarkNet.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 2ee7891..c786f06 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -627,8 +627,8 @@ public static void Server() {
globalConfig.ThreadAwakeTimeout = (uint)serverTickRate;
globalConfig.MaxHosts = 1;
globalConfig.MaxPacketSize = (ushort)((messageData.Length * 2) + 32);
- globalConfig.ReactorMaximumSentMessages = (ushort)((reliableMessages + unreliableMessages) * sendRate);;
- globalConfig.ReactorMaximumReceivedMessages = (ushort)((reliableMessages + unreliableMessages) * sendRate);;
+ globalConfig.ReactorMaximumSentMessages = (ushort)((reliableMessages + unreliableMessages) * sendRate);
+ globalConfig.ReactorMaximumReceivedMessages = (ushort)((reliableMessages + unreliableMessages) * sendRate);
ConnectionConfig connectionConfig = new ConnectionConfig();
From 99aec068dba264216a4558d23ad61062a48fc120 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 8 Sep 2018 09:06:38 +0500
Subject: [PATCH 126/159] Refactor of spinner
---
BenchmarkNet.cs | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index c786f06..559d420 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -366,21 +366,14 @@ await Task.Factory.StartNew(() => {
if (spinnerTimer >= 10) {
spinnerSequence++;
spinnerTimer = 0;
+
+ if (spinnerSequence == spinner.Length)
+ spinnerSequence = 0;
} else {
spinnerTimer++;
}
- switch (spinnerSequence % 4) {
- case 0: Console.WriteLine(spinner[0]);
- break;
- case 1: Console.WriteLine(spinner[1]);
- break;
- case 2: Console.WriteLine(spinner[2]);
- break;
- case 3: Console.WriteLine(spinner[3]);
- break;
- }
-
+ Console.WriteLine(spinner[spinnerSequence]);
Thread.Sleep(15);
}
From 50d78dee793fda3958e15687e31f44e372bb9936 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sun, 9 Sep 2018 04:43:52 +0500
Subject: [PATCH 127/159] Fix rewriting of static strings
---
BenchmarkNet.cs | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 559d420..e478e8b 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -324,16 +324,17 @@ await Task.Factory.StartNew(() => {
spinner[i] = Environment.NewLine + "Press any key to stop the process" + Space(1) + spinner[i];
}
+ Console.WriteLine(strings[0]);
+ Console.WriteLine(strings[1]);
+ Console.WriteLine(strings[2]);
+ Console.WriteLine(strings[3]);
+
StringBuilder info = new StringBuilder(1024);
Stopwatch elapsedTime = Stopwatch.StartNew();
while (processActive) {
Console.CursorVisible = false;
- Console.SetCursorPosition(0, 0);
- Console.WriteLine(strings[0]);
- Console.WriteLine(strings[1]);
- Console.WriteLine(strings[2]);
- Console.WriteLine(strings[3]);
+ Console.SetCursorPosition(0, 4);
if (!maxClientsPass || lowLatencyMode)
Console.WriteLine();
From dcfc03ff010371eccd48c8c69b8f1774f4aaa5d5 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 14 Sep 2018 16:02:35 +0500
Subject: [PATCH 128/159] Update LICENSE
---
LICENSE | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/LICENSE b/LICENSE
index 6d7bca5..66e956b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2018 Stanislav Denisov
+Copyright (c) 2018 Stanislav Denisov (nxrighthere@gmail.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
From 33442e840cc3a4c8780634de2ca09fc65cbacf6e Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 18 Sep 2018 16:20:21 +0500
Subject: [PATCH 129/159] Update to major 1.10 version
- Add multi-process instances
- Add self-monitoring and execution of instances
- Add memory-mapped data exchange between instances
- Rework layout of output text
- Rework user-specified configuration
- Replace unsafe ENet with ENet-CSharp
- Minor changes for LiteNetLib
- Change Sustained Low Latency mode to work with the server instance only
- Preparing for GUI integration
---
BenchmarkNet.cs | 953 ++++++++++++++++++++++++++++++------------------
1 file changed, 598 insertions(+), 355 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index e478e8b..6b50ec7 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -22,14 +22,19 @@
*/
using System;
+using System.Configuration;
using System.Diagnostics;
using System.IO;
+using System.IO.MemoryMappedFiles;
+using System.IO.Pipes;
using System.Net;
+using System.Reflection;
using System.Runtime;
+using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-// ENet 1.3.13 (https://github.com/lsalzman/enet) C# Wrapper (https://github.com/NateShoffner/ENetSharp)
+// ENet 2.0.8 (https://github.com/nxrighthere/ENet-CSharp)
using ENet;
// UNet 1.0.0.9 (https://forum.unity.com/threads/standalone-library-binaries-aka-server-dll.526718)
using UnetServerDll;
@@ -48,7 +53,7 @@
// Neutrino 1.0 (https://github.com/Claytonious/Neutrino)
using Neutrino.Core;
using Neutrino.Core.Messages;
-// DarkRift 2.1.2 (https://darkriftnetworking.com/DarkRift2)
+// DarkRift 2.2.0 (https://darkriftnetworking.com/DarkRift2)
using DarkRift;
using DarkRift.Server;
using DarkRift.Client;
@@ -56,62 +61,49 @@
namespace NX {
public abstract class BenchmarkNet {
// Meta
- protected const string title = "BenchmarkNet";
- protected const string version = "1.09";
+ public const string title = "BenchmarkNet";
+ public const string version = "1.10";
// Parameters
- protected const string ip = "127.0.0.1";
- protected static ushort port = 0;
- protected static ushort maxClients = 0;
- protected static int serverTickRate = 0;
- protected static int clientTickRate = 0;
- protected static int sendRate = 0;
- protected static int reliableMessages = 0;
- protected static int unreliableMessages = 0;
- // Data
- protected static string message = String.Empty;
- protected static char[] reversedMessage;
- protected static byte[] messageData;
- protected static byte[] reversedData;
- // Modes
- protected static bool instantMode = false;
- protected static bool lowLatencyMode = false;
- // Debug
- protected static bool disableInfo = false;
- protected static bool disableSupervisor = false;
+ public const string ip = "127.0.0.1";
+ public static byte selectedLibrary = 0;
+ public static ushort port = 0;
+ public static ushort maxClients = 0;
+ public static int serverTickRate = 0;
+ public static int clientTickRate = 0;
+ public static int sendRate = 0;
+ public static int reliableMessages = 0;
+ public static int unreliableMessages = 0;
+ public static string message = String.Empty;
// Status
- protected static bool processActive = false;
- protected static bool processCompleted = false;
- protected static bool processCrashed = false;
- protected static bool processFailure = false;
- protected static bool processOverload = false;
+ public static bool processActive = false;
+ public static bool processCompleted = false;
+ public static bool processCrashed = false;
+ public static bool processFailure = false;
+ public static bool processOverload = false;
+ public static bool processUninitialized = true;
// Stats
- protected static volatile int clientsStartedCount = 0;
- protected static volatile int clientsConnectedCount = 0;
- protected static volatile int clientsStreamsCount = 0;
- protected static volatile int clientsDisconnectedCount = 0;
- protected static volatile int serverReliableSent = 0;
- protected static volatile int serverReliableReceived = 0;
- protected static volatile int serverReliableBytesSent = 0;
- protected static volatile int serverReliableBytesReceived = 0;
- protected static volatile int serverUnreliableSent = 0;
- protected static volatile int serverUnreliableReceived = 0;
- protected static volatile int serverUnreliableBytesSent = 0;
- protected static volatile int serverUnreliableBytesReceived = 0;
- protected static volatile int clientsReliableSent = 0;
- protected static volatile int clientsReliableReceived = 0;
- protected static volatile int clientsReliableBytesSent = 0;
- protected static volatile int clientsReliableBytesReceived = 0;
- protected static volatile int clientsUnreliableSent = 0;
- protected static volatile int clientsUnreliableReceived = 0;
- protected static volatile int clientsUnreliableBytesSent = 0;
- protected static volatile int clientsUnreliableBytesReceived = 0;
- // Internals
- private static byte selectedLibrary = 0;
- private static ushort maxPeers = 0;
- private static bool maxClientsPass = true;
- private static Thread serverThread;
- private static GCLatencyMode initGCLatencyMode;
- private static readonly string[] networkingLibraries = {
+ public static volatile int clientsStartedCount = 0;
+ public static volatile int clientsConnectedCount = 0;
+ public static volatile int clientsStreamsCount = 0;
+ public static volatile int clientsDisconnectedCount = 0;
+ public static volatile int serverReliableSent = 0;
+ public static volatile int serverReliableReceived = 0;
+ public static volatile int serverReliableBytesSent = 0;
+ public static volatile int serverReliableBytesReceived = 0;
+ public static volatile int serverUnreliableSent = 0;
+ public static volatile int serverUnreliableReceived = 0;
+ public static volatile int serverUnreliableBytesSent = 0;
+ public static volatile int serverUnreliableBytesReceived = 0;
+ public static volatile int clientsReliableSent = 0;
+ public static volatile int clientsReliableReceived = 0;
+ public static volatile int clientsReliableBytesSent = 0;
+ public static volatile int clientsReliableBytesReceived = 0;
+ public static volatile int clientsUnreliableSent = 0;
+ public static volatile int clientsUnreliableReceived = 0;
+ public static volatile int clientsUnreliableBytesSent = 0;
+ public static volatile int clientsUnreliableBytesReceived = 0;
+ // Libraries
+ public static readonly string[] networkingLibraries = {
"ENet",
"UNet",
"LiteNetLib",
@@ -122,115 +114,119 @@ public abstract class BenchmarkNet {
"Neutrino",
"DarkRift"
};
+ // Data
+ protected static char[] reversedMessage;
+ protected static byte[] messageData;
+ protected static byte[] reversedData;
+ // Internals
+ private static bool serverInstance = false;
+ private static bool clientsInstance = false;
+ private static bool maxClientsPass = true;
+ private static bool sustainedLowLatency = false;
+ private static ushort maxPeers = 0;
+ private static int memoryLength = 512;
+ private static BinaryFormatter binaryFormatter;
+ private static Thread serverThread;
+ private static ServerMessage serverMessage;
+ private static ClientsMessage clientsMessage;
+ private static MemoryMappedFile serverData;
+ private static MemoryMappedFile clientsData;
+ private static MemoryMappedViewStream serverStream;
+ private static MemoryMappedViewStream clientsStream;
+ private static NamedPipeServerStream masterPipeServer;
+ private static NamedPipeServerStream masterPipeClients;
+ private static Process serverProcess;
+ private static Process clientsProcess;
+ private const ushort defaultPort = 9500;
+ private const ushort defaultMaxClients = 1000;
+ private const int defaultServerTickRate = 64;
+ private const int defaultClientTickRate = 64;
+ private const int defaultSendRate = 15;
+ private const int defaultReliableMessages = 500;
+ private const int defaultUnreliableMessages = 1000;
+ private const string defaultMessage = "Sometimes we just need a good networking library";
// Functions
- private static readonly Func Space = (value) => (String.Empty.PadRight(value));
- private static readonly Func PayloadFlow = (clientsStreamsCount, messageLength, sendRate) => (clientsStreamsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
-
- private static void Main(string[] arguments) {
- Console.Title = title;
-
- for (int i = 0; i < arguments.Length; i++) {
- string argument = arguments[i].ToLower();
-
- if (argument == "-instant")
- instantMode = true;
-
- if (argument == "-lowlatency")
- lowLatencyMode = true;
-
- if (argument == "-disable-info")
- disableInfo = true;
-
- if (argument == "-disable-supervisor")
- disableSupervisor = true;
- }
-
- Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
-
- Start:
- Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
-
- Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
- Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
+ #if !GUI
+ private static readonly Func Space = (value) => (String.Empty.PadRight(value));
+ private static readonly Func PayloadThroughput = (clientsStreamsCount, messageLength, sendRate) => (clientsStreamsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
+ #else
+
+ #endif
+
+ [Serializable]
+ private struct ServerMessage {
+ public bool uninitialized;
+ public int reliableSent;
+ public int reliableReceived;
+ public int reliableBytesSent;
+ public int reliableBytesReceived;
+ public int unreliableSent;
+ public int unreliableReceived;
+ public int unreliableBytesSent;
+ public int unreliableBytesReceived;
+ }
- if (lowLatencyMode) {
- Console.ForegroundColor = ConsoleColor.Yellow;
- Console.WriteLine(Environment.NewLine + "The process will perform in Sustained Low Latency mode.");
- Console.ResetColor();
- }
+ [Serializable]
+ private struct ClientsMessage {
+ public int StartedCount;
+ public int ConnectedCount;
+ public int StreamsCount;
+ public int DisconnectedCount;
+ public int ReliableSent;
+ public int ReliableReceived;
+ public int ReliableBytesSent;
+ public int ReliableBytesReceived;
+ public int UnreliableSent;
+ public int UnreliableReceived;
+ public int UnreliableBytesSent;
+ public int UnreliableBytesReceived;
+ }
- Console.WriteLine(Environment.NewLine + "Select a networking library");
+ public static bool Initialize() {
+ binaryFormatter = new BinaryFormatter();
- for (int i = 0; i < networkingLibraries.Length; i++) {
- Console.WriteLine("(" + i + ") " + networkingLibraries[i]);
- }
+ serverData = MemoryMappedFile.CreateOrOpen(title + "ServerData", memoryLength, MemoryMappedFileAccess.ReadWrite);
+ serverStream = serverData.CreateViewStream(0, memoryLength);
+ binaryFormatter.Serialize(serverStream, serverMessage);
+ serverStream.Seek(0, SeekOrigin.Begin);
- Console.Write(Environment.NewLine + "Enter the number (default 0): ");
- Byte.TryParse(Console.ReadLine(), out selectedLibrary);
-
- if (selectedLibrary == 0)
- serverThread = new Thread(ENetBenchmark.Server);
- else if (selectedLibrary == 1)
- serverThread = new Thread(UNetBenchmark.Server);
- else if (selectedLibrary == 2)
- serverThread = new Thread(LiteNetLibBenchmark.Server);
- else if (selectedLibrary == 3)
- serverThread = new Thread(LidgrenBenchmark.Server);
- else if (selectedLibrary == 4)
- serverThread = new Thread(MiniUDPBenchmark.Server);
- else if (selectedLibrary == 5)
- serverThread = new Thread(HazelBenchmark.Server);
- else if (selectedLibrary == 6)
- serverThread = new Thread(PhotonBenchmark.Server);
- else if (selectedLibrary == 7)
- serverThread = new Thread(NeutrinoBenchmark.Server);
- else if (selectedLibrary == 8)
- serverThread = new Thread(DarkRiftBenchmark.Server);
-
- if (serverThread == null) {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("Please, enter a valid number of the networking library!");
- Console.ReadKey();
- Console.ResetColor();
- Console.Clear();
+ clientsData = MemoryMappedFile.CreateOrOpen(title + "ClientsData", memoryLength, MemoryMappedFileAccess.ReadWrite);
+ clientsStream = clientsData.CreateViewStream(0, memoryLength);
+ binaryFormatter.Serialize(clientsStream, clientsMessage);
+ clientsStream.Seek(0, SeekOrigin.Begin);
- goto Start;
+ if (serverInstance) {
+ if (selectedLibrary == 0)
+ serverThread = new Thread(ENetBenchmark.Server);
+ else if (selectedLibrary == 1)
+ serverThread = new Thread(UNetBenchmark.Server);
+ else if (selectedLibrary == 2)
+ serverThread = new Thread(LiteNetLibBenchmark.Server);
+ else if (selectedLibrary == 3)
+ serverThread = new Thread(LidgrenBenchmark.Server);
+ else if (selectedLibrary == 4)
+ serverThread = new Thread(MiniUDPBenchmark.Server);
+ else if (selectedLibrary == 5)
+ serverThread = new Thread(HazelBenchmark.Server);
+ else if (selectedLibrary == 6)
+ serverThread = new Thread(PhotonBenchmark.Server);
+ else if (selectedLibrary == 7)
+ serverThread = new Thread(NeutrinoBenchmark.Server);
+ else if (selectedLibrary == 8)
+ serverThread = new Thread(DarkRiftBenchmark.Server);
+
+ if (serverThread == null)
+ return false;
}
- const ushort defaultPort = 9500;
- const ushort defaultMaxClients = 1000;
- const int defaultServerTickRate = 64;
- const int defaultClientTickRate = 64;
- const int defaultSendRate = 15;
- const int defaultReliableMessages = 500;
- const int defaultUnreliableMessages = 1000;
- const string defaultMessage = "Sometimes we just need a good networking library";
-
- if (!instantMode) {
- Console.Write("Port (default " + defaultPort + "): ");
- UInt16.TryParse(Console.ReadLine(), out port);
-
- Console.Write("Simulated clients (default " + defaultMaxClients + "): ");
- UInt16.TryParse(Console.ReadLine(), out maxClients);
-
- Console.Write("Server tick rate (default " + defaultServerTickRate + "): ");
- Int32.TryParse(Console.ReadLine(), out serverTickRate);
-
- Console.Write("Client tick rate (default " + defaultClientTickRate + "): ");
- Int32.TryParse(Console.ReadLine(), out clientTickRate);
-
- Console.Write("Client send rate (default " + defaultSendRate + "): ");
- Int32.TryParse(Console.ReadLine(), out sendRate);
-
- Console.Write("Reliable messages per client (default " + defaultReliableMessages + "): ");
- Int32.TryParse(Console.ReadLine(), out reliableMessages);
-
- Console.Write("Unreliable messages per client (default " + defaultUnreliableMessages + "): ");
- Int32.TryParse(Console.ReadLine(), out unreliableMessages);
-
- Console.Write("Message (default " + defaultMessage.Length + " characters): ");
- message = Console.ReadLine();
- }
+ UInt16.TryParse(ConfigurationManager.AppSettings["Port"], out port);
+ Int32.TryParse(ConfigurationManager.AppSettings["ServerTickRate"], out serverTickRate);
+ Int32.TryParse(ConfigurationManager.AppSettings["ClientTickRate"], out clientTickRate);
+ Int32.TryParse(ConfigurationManager.AppSettings["SendRate"], out sendRate);
+ Int32.TryParse(ConfigurationManager.AppSettings["ReliableMessages"], out reliableMessages);
+ Int32.TryParse(ConfigurationManager.AppSettings["UnreliableMessages"], out unreliableMessages);
+ message = ConfigurationManager.AppSettings["Message"];
+ Boolean.TryParse(ConfigurationManager.AppSettings["SustainedLowLatency"], out sustainedLowLatency);
if (port == 0)
port = defaultPort;
@@ -261,132 +257,366 @@ private static void Main(string[] arguments) {
messageData = Encoding.ASCII.GetBytes(message);
reversedData = Encoding.ASCII.GetBytes(new string(reversedMessage));
- Console.CursorVisible = false;
- Console.Clear();
+ #if !GUI
+ Console.CursorVisible = false;
+ Console.Clear();
+ #endif
processActive = true;
- if (lowLatencyMode) {
- initGCLatencyMode = GCSettings.LatencyMode;
- GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
+ if (serverInstance || clientsInstance) {
+ if (selectedLibrary == 0)
+ ENet.Library.Initialize();
}
- if (selectedLibrary == 0)
- ENet.Library.Initialize();
+ if (serverInstance) {
+ if (sustainedLowLatency)
+ GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
- maxPeers = ushort.MaxValue - 1;
- maxClientsPass = (selectedLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID);
+ maxPeers = ushort.MaxValue - 1;
+ maxClientsPass = (selectedLibrary > 0 ? maxClients <= maxPeers : maxClients <= ENet.Library.maxPeers);
- if (!maxClientsPass)
- maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedLibrary > 0 ? maxPeers : (ushort)ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID));
+ if (!maxClientsPass)
+ maxClients = Math.Min(Math.Max((ushort)1, (ushort)maxClients), (selectedLibrary > 0 ? maxPeers : (ushort)ENet.Library.maxPeers));
- serverThread.Priority = ThreadPriority.AboveNormal;
- serverThread.Start();
- Thread.Sleep(100);
+ serverThread.Priority = ThreadPriority.AboveNormal;
+ serverThread.Start();
+ Thread.Sleep(100);
+ }
- Task infoTask = disableInfo ? null : Info();
- Task superviseTask = disableSupervisor ? null : Supervise();
- Task spawnTask = Spawn();
+ if (!serverInstance && !clientsInstance) {
+ serverProcess = Process.Start(new ProcessStartInfo {
+ FileName = Assembly.GetExecutingAssembly().Location,
+ Arguments = "-library:" + selectedLibrary + " -server:" + maxClients,
+ CreateNoWindow = true,
+ UseShellExecute = false
+ });
+
+ clientsProcess = Process.Start(new ProcessStartInfo {
+ FileName = Assembly.GetExecutingAssembly().Location,
+ Arguments = "-library:" + selectedLibrary + " -clients:" + maxClients,
+ CreateNoWindow = true,
+ UseShellExecute = false
+ });
+ }
- Console.ReadKey();
- processActive = false;
- Environment.Exit(0);
+ Task pulseTask = Pulse();
+ Task dataTask = Data();
+
+ #if !GUI
+ Task infoTask = serverInstance || clientsInstance ? null : Info();
+ #endif
+
+ Task superviseTask = serverInstance || clientsInstance ? null : Supervise();
+ Task spawnTask = serverInstance || !clientsInstance ? null : Spawn();
+
+ if (serverInstance)
+ processUninitialized = false;
+
+ return true;
}
- private static async Task Info() {
- await Task.Factory.StartNew(() => {
- int spinnerTimer = 0;
- int spinnerSequence = 0;
- string space = Space(10);
- string[] spinner = {
- "/",
- "—",
- "\\",
- "|"
- };
- string[] status = {
- "Running" + Space(2),
- "Crashed" + Space(2),
- "Failure" + Space(2),
- "Overload" + Space(1),
- "Completed"
- };
- string[] strings = {
- "Benchmarking " + networkingLibraries[selectedLibrary] + "...",
- "Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
- maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + messageData.Length + " bytes per message, " + sendRate + " messages per second",
- "GC mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server"),
- "This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : ENet.Native.ENET_PROTOCOL_MAXIMUM_PEER_ID).ToString() + " peers per server!",
- "The process is performing in Sustained Low Latency mode.",
- };
+ private static void Deinitialize() {
+ serverProcess.Kill();
+ clientsProcess.Kill();
+ }
+
+ [STAThread]
+ private static void Main(string[] arguments) {
+ for (int i = 0; i < arguments.Length; i++) {
+ string argument = arguments[i].ToLower();
- for (int i = 0; i < spinner.Length; i++) {
- spinner[i] = Environment.NewLine + "Press any key to stop the process" + Space(1) + spinner[i];
+ if (argument.Contains("-library"))
+ Byte.TryParse(argument.Substring(argument.LastIndexOf(":") + 1), out selectedLibrary);
+
+ if (argument.Contains("-server")) {
+ serverInstance = true;
+ UInt16.TryParse(argument.Substring(argument.LastIndexOf(":") + 1), out maxClients);
}
- Console.WriteLine(strings[0]);
- Console.WriteLine(strings[1]);
- Console.WriteLine(strings[2]);
- Console.WriteLine(strings[3]);
+ if (argument.Contains("-clients")) {
+ clientsInstance = true;
+ UInt16.TryParse(argument.Substring(argument.LastIndexOf(":") + 1), out maxClients);
+ }
+ }
- StringBuilder info = new StringBuilder(1024);
- Stopwatch elapsedTime = Stopwatch.StartNew();
+ #if GUI
+
+ #else
+ Console.Title = title;
+ Console.SetIn(new StreamReader(Console.OpenStandardInput(8192), Console.InputEncoding, false, bufferSize: 1024));
- while (processActive) {
- Console.CursorVisible = false;
- Console.SetCursorPosition(0, 4);
+ Start:
- if (!maxClientsPass || lowLatencyMode)
- Console.WriteLine();
+ if (!serverInstance && !clientsInstance) {
+ Console.WriteLine("Welcome to " + title + Space(1) + version + "!");
- if (!maxClientsPass) {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine(strings[4]);
- Console.ResetColor();
- }
+ Console.WriteLine(Environment.NewLine + "Source code is available on GitHub (https://github.com/nxrighthere/BenchmarkNet)");
+ Console.WriteLine("If you have any questions, contact me (nxrighthere@gmail.com)");
- if (lowLatencyMode) {
+ if (sustainedLowLatency) {
Console.ForegroundColor = ConsoleColor.Yellow;
- Console.WriteLine(strings[5]);
+ Console.WriteLine(Environment.NewLine + "The server process will perform in Sustained Low Latency mode.");
Console.ResetColor();
}
- info.Clear();
- info.AppendLine().Append("Server status: ").Append(processCrashed ? status[1] : (processFailure ? status[2] : (processOverload ? status[3] : (processCompleted ? status[4] : status[0]))));
- info.AppendLine().Append("Clients status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
- info.AppendLine().Append("Server payload flow: ").Append(PayloadFlow(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadFlow(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(space);
- info.AppendLine().Append("Clients sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
- info.AppendLine().Append("Server received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)");
- info.AppendLine().Append("Server sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)");
- info.AppendLine().Append("Clients received <- Reliable: ").Append(clientsReliableReceived).Append(" messages (").Append(clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append(clientsUnreliableReceived).Append(" messages (").Append(clientsUnreliableBytesReceived).Append(" bytes)");
- info.AppendLine().Append("Total - Reliable: ").Append((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived).Append(" messages (").Append((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived).Append(" messages (").Append((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived).Append(" bytes)");
- info.AppendLine().Append("Expected - Reliable: ").Append(maxClients * (ulong)reliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4).Append(" bytes), Unreliable: ").Append(maxClients * (ulong)unreliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4).Append(" bytes)");
- info.AppendLine().Append("Elapsed time: ").Append(elapsedTime.Elapsed.Hours.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Minutes.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Seconds.ToString("00"));
- Console.WriteLine(info);
-
- if (spinnerTimer >= 10) {
- spinnerSequence++;
- spinnerTimer = 0;
-
- if (spinnerSequence == spinner.Length)
- spinnerSequence = 0;
- } else {
- spinnerTimer++;
+ Console.WriteLine(Environment.NewLine + "Select the networking library:");
+
+ for (int i = 0; i < networkingLibraries.Length; i++) {
+ Console.WriteLine("(" + i + ") " + networkingLibraries[i]);
}
- Console.WriteLine(spinner[spinnerSequence]);
- Thread.Sleep(15);
+ Console.Write(Environment.NewLine + "Enter the number (default 0): ");
+ Byte.TryParse(Console.ReadLine(), out selectedLibrary);
+
+ Console.Write("Simulated clients (default " + defaultMaxClients + "): ");
+ UInt16.TryParse(Console.ReadLine(), out maxClients);
+
+ if (selectedLibrary >= networkingLibraries.Length) {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("Please, enter a valid number of the networking library!");
+ Console.ReadKey();
+ Console.ResetColor();
+ Console.Clear();
+
+ goto Start;
+ }
+ }
+
+ if (!Initialize()) {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("Initialization failed!");
+ Console.ReadKey();
+ processActive = false;
+ Environment.Exit(0);
+ }
+
+ Console.ReadKey();
+ #endif
+
+ processActive = false;
+
+ Deinitialize();
+
+ Environment.Exit(0);
+ }
+
+ private static async Task Pulse() {
+ await Task.Factory.StartNew(() => {
+ const string serverPipeName = title + "Server";
+ const string clientsPipeName = title + "Clients";
+
+ if (serverInstance) {
+ NamedPipeClientStream serverPipe = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
+
+ serverPipe.Connect();
+ serverPipe.BeginRead(new byte[1], 0, 1, (result) => { Environment.Exit(0); }, serverPipe);
+ } else if (clientsInstance) {
+ NamedPipeClientStream clientsPipe = new NamedPipeClientStream(".", clientsPipeName, PipeDirection.In);
+
+ clientsPipe.Connect();
+ clientsPipe.BeginRead(new byte[1], 0, 1, (result) => { Environment.Exit(0); }, clientsPipe);
+ } else {
+ Task.Run(async() => {
+ masterPipeServer = new NamedPipeServerStream(serverPipeName, PipeDirection.Out);
+
+ await masterPipeServer.WaitForConnectionAsync();
+ });
+
+ Task.Run(async() => {
+ masterPipeClients = new NamedPipeServerStream(clientsPipeName, PipeDirection.Out);
+
+ await masterPipeClients.WaitForConnectionAsync();
+ });
}
+ }, TaskCreationOptions.LongRunning);
+ }
+
+ private static async Task Data() {
+ await Task.Factory.StartNew(() => {
+ byte[] serverBuffer = serverInstance || clientsInstance ? null : new byte[memoryLength];
+ byte[] clientsBuffer = serverInstance || clientsInstance ? null : new byte[memoryLength];
- elapsedTime.Stop();
+ serverMessage = default(ServerMessage);
+ clientsMessage = default(ClientsMessage);
- if (!processActive && processCompleted) {
- Console.SetCursorPosition(0, Console.CursorTop - 1);
- Console.WriteLine("Process completed! Press any key to exit...");
+ while (processActive) {
+ if (serverInstance) {
+ serverMessage.uninitialized = processUninitialized;
+ serverMessage.uninitialized = processUninitialized;
+ serverMessage.reliableSent = serverReliableSent;
+ serverMessage.reliableReceived = serverReliableReceived;
+ serverMessage.reliableBytesSent = serverReliableBytesSent;
+ serverMessage.reliableBytesReceived = serverReliableBytesReceived;
+ serverMessage.unreliableSent = serverUnreliableSent;
+ serverMessage.unreliableReceived = serverUnreliableReceived;
+ serverMessage.unreliableBytesSent = serverUnreliableBytesSent;
+ serverMessage.unreliableBytesReceived = serverUnreliableBytesReceived;
+
+ binaryFormatter.Serialize(serverStream, serverMessage);
+ serverStream.Seek(0, SeekOrigin.Begin);
+ } else if (clientsInstance) {
+ clientsMessage.StartedCount = clientsStartedCount;
+ clientsMessage.ConnectedCount = clientsConnectedCount;
+ clientsMessage.StreamsCount = clientsStreamsCount;
+ clientsMessage.DisconnectedCount = clientsDisconnectedCount;
+ clientsMessage.ReliableSent = clientsReliableSent;
+ clientsMessage.ReliableReceived = clientsReliableReceived;
+ clientsMessage.ReliableBytesSent = clientsReliableBytesSent;
+ clientsMessage.ReliableBytesReceived = clientsReliableBytesReceived;
+ clientsMessage.UnreliableSent = clientsUnreliableSent;
+ clientsMessage.UnreliableReceived = clientsUnreliableReceived;
+ clientsMessage.UnreliableBytesSent = clientsUnreliableBytesSent;
+ clientsMessage.UnreliableBytesReceived = clientsUnreliableBytesReceived;
+
+ binaryFormatter.Serialize(clientsStream, clientsMessage);
+ clientsStream.Seek(0, SeekOrigin.Begin);
+ } else {
+ serverStream.Read(serverBuffer, 0, memoryLength);
+ clientsStream.Read(clientsBuffer, 0, memoryLength);
+
+ using (MemoryStream stream = new MemoryStream(serverBuffer)) {
+ serverMessage = (ServerMessage)binaryFormatter.Deserialize(stream);
+
+ processUninitialized = serverMessage.uninitialized;
+ serverReliableSent = serverMessage.reliableSent;
+ serverReliableReceived = serverMessage.reliableReceived;
+ serverReliableBytesSent = serverMessage.reliableBytesSent;
+ serverReliableBytesReceived = serverMessage.reliableBytesReceived;
+ serverUnreliableSent = serverMessage.unreliableSent;
+ serverUnreliableReceived = serverMessage.unreliableReceived;
+ serverUnreliableBytesSent = serverMessage.unreliableBytesSent;
+ serverUnreliableBytesReceived = serverMessage.unreliableBytesReceived;
+ }
+
+ using (MemoryStream stream = new MemoryStream(clientsBuffer)) {
+ clientsMessage = (ClientsMessage)binaryFormatter.Deserialize(stream);
+
+ clientsStartedCount = clientsMessage.StartedCount;
+ clientsConnectedCount = clientsMessage.ConnectedCount;
+ clientsStreamsCount = clientsMessage.StreamsCount;
+ clientsDisconnectedCount = clientsMessage.DisconnectedCount;
+ clientsReliableSent = clientsMessage.ReliableSent;
+ clientsReliableReceived = clientsMessage.ReliableReceived;
+ clientsReliableBytesSent = clientsMessage.ReliableBytesSent;
+ clientsReliableBytesReceived = clientsMessage.ReliableBytesReceived;
+ clientsUnreliableSent = clientsMessage.UnreliableSent;
+ clientsUnreliableReceived = clientsMessage.UnreliableReceived;
+ clientsUnreliableBytesSent = clientsMessage.UnreliableBytesSent;
+ clientsUnreliableBytesReceived = clientsMessage.UnreliableBytesReceived;
+ }
+
+ serverStream.Seek(0, SeekOrigin.Begin);
+ clientsStream.Seek(0, SeekOrigin.Begin);
+ }
+
+ Thread.Sleep(15);
}
}, TaskCreationOptions.LongRunning);
}
+ #if !GUI
+ private static async Task Info() {
+ await Task.Factory.StartNew(() => {
+ int spinnerTimer = 0;
+ int spinnerSequence = 0;
+ string space = Space(10);
+ string[] spinner = {
+ "/",
+ "—",
+ "\\",
+ "|"
+ };
+ string[] status = {
+ "Running" + Space(6),
+ "Crashed" + Space(6),
+ "Failure" + Space(6),
+ "Overload" + Space(5),
+ "Completed" + Space(4),
+ "Uninitialized"
+ };
+ string[] strings = {
+ "Benchmarking " + networkingLibraries[selectedLibrary] + "...",
+ "Server tick rate: " + serverTickRate + ", Client tick rate: " + clientTickRate + " (ticks per second)",
+ maxClients + " clients, " + reliableMessages + " reliable and " + unreliableMessages + " unreliable messages per client, " + sendRate + " messages per second, " + messageData.Length + " bytes per message",
+ "GC mode: " + (!GCSettings.IsServerGC ? "Workstation" : "Server"),
+ "This networking library doesn't support more than " + (selectedLibrary > 0 ? maxPeers : ENet.Library.maxPeers).ToString() + " peers per server!",
+ "The server process is performing in Sustained Low Latency mode.",
+ };
+
+ for (int i = 0; i < spinner.Length; i++) {
+ spinner[i] = Environment.NewLine + "Press any key to stop the process" + Space(1) + spinner[i];
+ }
+
+ Console.WriteLine(strings[0]);
+ Console.WriteLine(strings[1]);
+ Console.WriteLine(strings[2]);
+ Console.WriteLine(strings[3]);
+
+ StringBuilder info = new StringBuilder(1024);
+ Stopwatch elapsedTime = Stopwatch.StartNew();
+
+ while (processActive) {
+ Console.CursorVisible = false;
+ Console.SetCursorPosition(0, 4);
+
+ if (!maxClientsPass || sustainedLowLatency)
+ Console.WriteLine();
+
+ if (!maxClientsPass) {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine(strings[4]);
+ Console.ResetColor();
+ }
+
+ if (sustainedLowLatency) {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine(strings[5]);
+ Console.ResetColor();
+ }
+
+ info.Clear();
+ info.AppendLine().Append("[Server]");
+ info.AppendLine().Append("Status: ").Append(processCrashed ? status[1] : (processFailure ? status[2] : (processOverload ? status[3] : (processCompleted ? status[4] : (processUninitialized ? status[5] : status[0])))));
+ info.AppendLine().Append("Sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)");
+ info.AppendLine().Append("Received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)");
+ info.AppendLine().Append("Payload throughput: ").Append(PayloadThroughput(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadThroughput(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(space);
+ info.AppendLine();
+ info.AppendLine().Append("[Clients]");
+ info.AppendLine().Append("Status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
+ info.AppendLine().Append("Sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
+ info.AppendLine().Append("Received <- Reliable: ").Append(clientsReliableReceived).Append(" messages (").Append(clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append(clientsUnreliableReceived).Append(" messages (").Append(clientsUnreliableBytesReceived).Append(" bytes)");
+ info.AppendLine();
+ info.AppendLine().Append("[Summary]");
+ info.AppendLine().Append("Total - Reliable: ").Append((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived).Append(" messages (").Append((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived).Append(" messages (").Append((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived).Append(" bytes)");
+ info.AppendLine().Append("Expected - Reliable: ").Append(maxClients * (ulong)reliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4).Append(" bytes), Unreliable: ").Append(maxClients * (ulong)unreliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4).Append(" bytes)");
+ info.AppendLine().Append("Elapsed time: ").Append(elapsedTime.Elapsed.Hours.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Minutes.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Seconds.ToString("00"));
+ Console.WriteLine(info);
+
+ if (spinnerTimer >= 10) {
+ spinnerSequence++;
+ spinnerTimer = 0;
+
+ if (spinnerSequence == spinner.Length)
+ spinnerSequence = 0;
+ } else {
+ spinnerTimer++;
+ }
+
+ Console.WriteLine(spinner[spinnerSequence]);
+ Thread.Sleep(1000 / 60);
+ }
+
+ elapsedTime.Stop();
+
+ if (!processActive && processCompleted) {
+ Console.SetCursorPosition(0, Console.CursorTop - 1);
+ Console.WriteLine("Process completed! Press any key to exit...");
+ }
+ }, TaskCreationOptions.LongRunning);
+ }
+ #endif
+
private static async Task Supervise() {
await Task.Factory.StartNew(() => {
decimal currentData = 0;
@@ -399,7 +629,7 @@ await Task.Factory.StartNew(() => {
Collect:
currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
- if (!serverThread.IsAlive)
+ if (serverProcess.HasExited)
processCrashed = true;
if (currentData == lastData) {
@@ -420,17 +650,18 @@ await Task.Factory.StartNew(() => {
Thread.Sleep(100);
processActive = false;
+ Deinitialize();
+
break;
}
lastData = currentData;
}
- if (selectedLibrary == 0)
- ENet.Library.Deinitialize();
-
- if (lowLatencyMode)
- GCSettings.LatencyMode = initGCLatencyMode;
+ if (serverInstance || clientsInstance) {
+ if (selectedLibrary == 0)
+ ENet.Library.Deinitialize();
+ }
}, TaskCreationOptions.LongRunning);
}
@@ -470,145 +701,153 @@ await Task.Factory.StartNew(() => {
public sealed class ENetBenchmark : BenchmarkNet {
private static void SendReliable(byte[] data, byte channelID, Peer peer) {
- Packet packet = new Packet();
+ Packet packet = default(Packet);
- packet.Create(data, 0, data.Length, PacketFlags.Reliable); // Reliable Sequenced
- peer.Send(channelID, packet);
+ packet.Create(data, data.Length, PacketFlags.Reliable | PacketFlags.NoAllocate); // Reliable Sequenced
+ peer.Send(channelID, ref packet);
}
private static void SendUnreliable(byte[] data, byte channelID, Peer peer) {
- Packet packet = new Packet();
+ Packet packet = default(Packet);
- packet.Create(data, 0, data.Length, PacketFlags.None); // Unreliable Sequenced
- peer.Send(channelID, packet);
+ packet.Create(data, data.Length, PacketFlags.None | PacketFlags.NoAllocate); // Unreliable Sequenced
+ peer.Send(channelID, ref packet);
}
public static void Server() {
- Host server = new Host();
- Address address = new Address();
+ using (Host server = new Host()) {
+ Address address = new Address();
- address.Port = port;
+ address.Port = port;
- server.Create(address, maxClients, 4);
+ server.Create(address, maxClients, 4);
- while (processActive) {
- server.Service(1000 / serverTickRate, out Event netEvent);
-
- switch (netEvent.Type) {
- case EventType.Receive:
- if (netEvent.ChannelID == 2) {
- Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, netEvent.Packet.Length);
- SendReliable(messageData, 0, netEvent.Peer);
- Interlocked.Increment(ref serverReliableSent);
- Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
- } else if (netEvent.ChannelID == 3) {
- Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, netEvent.Packet.Length);
- SendUnreliable(reversedData, 1, netEvent.Peer);
- Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
- }
+ while (processActive) {
+ server.Service(1000 / serverTickRate, out Event netEvent);
+
+ switch (netEvent.Type) {
+ case EventType.None:
+ break;
- netEvent.Packet.Dispose();
+ case EventType.Receive:
+ if (netEvent.ChannelID == 2) {
+ Interlocked.Increment(ref serverReliableReceived);
+ Interlocked.Add(ref serverReliableBytesReceived, netEvent.Packet.Length);
+ SendReliable(messageData, 0, netEvent.Peer);
+ Interlocked.Increment(ref serverReliableSent);
+ Interlocked.Add(ref serverReliableBytesSent, messageData.Length);
+ } else if (netEvent.ChannelID == 3) {
+ Interlocked.Increment(ref serverUnreliableReceived);
+ Interlocked.Add(ref serverUnreliableBytesReceived, netEvent.Packet.Length);
+ SendUnreliable(reversedData, 1, netEvent.Peer);
+ Interlocked.Increment(ref serverUnreliableSent);
+ Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
+ }
- break;
+ netEvent.Packet.Dispose();
+
+ break;
+ }
}
}
}
public static async Task Client() {
await Task.Factory.StartNew(() => {
- Host client = new Host();
- Address address = new Address();
+ using (Host client = new Host()) {
+ Address address = new Address();
- address.SetHost(ip);
- address.Port = port;
+ address.SetHost(ip);
+ address.Port = port;
- client.Create(null, 1);
+ client.Create();
- Peer peer = client.Connect(address, 4, 0);
+ Peer peer = client.Connect(address, 4);
- int reliableToSend = 0;
- int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
+ int reliableToSend = 0;
+ int unreliableToSend = 0;
+ int reliableSentCount = 0;
+ int unreliableSentCount = 0;
- Task.Factory.StartNew(async() => {
- bool reliableIncremented = false;
- bool unreliableIncremented = false;
+ Task.Factory.StartNew(async() => {
+ bool reliableIncremented = false;
+ bool unreliableIncremented = false;
- while (processActive) {
- if (reliableToSend > 0) {
- SendReliable(messageData, 2, peer);
- Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
- Interlocked.Increment(ref clientsReliableSent);
- Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
- }
+ while (processActive) {
+ if (reliableToSend > 0) {
+ SendReliable(messageData, 2, peer);
+ Interlocked.Decrement(ref reliableToSend);
+ Interlocked.Increment(ref reliableSentCount);
+ Interlocked.Increment(ref clientsReliableSent);
+ Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
+ }
- if (unreliableToSend > 0) {
- SendUnreliable(reversedData, 3, peer);
- Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
- Interlocked.Increment(ref clientsUnreliableSent);
- Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
- }
+ if (unreliableToSend > 0) {
+ SendUnreliable(reversedData, 3, peer);
+ Interlocked.Decrement(ref unreliableToSend);
+ Interlocked.Increment(ref unreliableSentCount);
+ Interlocked.Increment(ref clientsUnreliableSent);
+ Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
+ }
- if (reliableToSend > 0 && !reliableIncremented) {
- reliableIncremented = true;
- Interlocked.Increment(ref clientsStreamsCount);
- } else if (reliableToSend == 0 && reliableIncremented) {
- reliableIncremented = false;
- Interlocked.Decrement(ref clientsStreamsCount);
- }
+ if (reliableToSend > 0 && !reliableIncremented) {
+ reliableIncremented = true;
+ Interlocked.Increment(ref clientsStreamsCount);
+ } else if (reliableToSend == 0 && reliableIncremented) {
+ reliableIncremented = false;
+ Interlocked.Decrement(ref clientsStreamsCount);
+ }
- if (unreliableToSend > 0 && !unreliableIncremented) {
- unreliableIncremented = true;
- Interlocked.Increment(ref clientsStreamsCount);
- } else if (unreliableToSend == 0 && unreliableIncremented) {
- unreliableIncremented = false;
- Interlocked.Decrement(ref clientsStreamsCount);
+ if (unreliableToSend > 0 && !unreliableIncremented) {
+ unreliableIncremented = true;
+ Interlocked.Increment(ref clientsStreamsCount);
+ } else if (unreliableToSend == 0 && unreliableIncremented) {
+ unreliableIncremented = false;
+ Interlocked.Decrement(ref clientsStreamsCount);
+ }
+
+ await Task.Delay(1000 / sendRate);
}
+ }, TaskCreationOptions.AttachedToParent);
- await Task.Delay(1000 / sendRate);
- }
- }, TaskCreationOptions.AttachedToParent);
+ while (processActive) {
+ client.Service(1000 / clientTickRate, out Event netEvent);
- while (processActive) {
- client.Service(1000 / clientTickRate, out Event netEvent);
+ switch (netEvent.Type) {
+ case EventType.None:
+ break;
- switch (netEvent.Type) {
- case EventType.Connect:
- Interlocked.Increment(ref clientsConnectedCount);
- Interlocked.Exchange(ref reliableToSend, reliableMessages);
- Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
+ case EventType.Connect:
+ Interlocked.Increment(ref clientsConnectedCount);
+ Interlocked.Exchange(ref reliableToSend, reliableMessages);
+ Interlocked.Exchange(ref unreliableToSend, unreliableMessages);
- break;
+ break;
- case EventType.Disconnect:
- Interlocked.Increment(ref clientsDisconnectedCount);
- Interlocked.Exchange(ref reliableToSend, 0);
- Interlocked.Exchange(ref unreliableToSend, 0);
+ case EventType.Disconnect: case EventType.Timeout:
+ Interlocked.Increment(ref clientsDisconnectedCount);
+ Interlocked.Exchange(ref reliableToSend, 0);
+ Interlocked.Exchange(ref unreliableToSend, 0);
- break;
+ break;
- case EventType.Receive:
- if (netEvent.ChannelID == 0) {
- Interlocked.Increment(ref clientsReliableReceived);
- Interlocked.Add(ref clientsReliableBytesReceived, netEvent.Packet.Length);
- } else if (netEvent.ChannelID == 1) {
- Interlocked.Increment(ref clientsUnreliableReceived);
- Interlocked.Add(ref clientsUnreliableBytesReceived, netEvent.Packet.Length);
- }
+ case EventType.Receive:
+ if (netEvent.ChannelID == 0) {
+ Interlocked.Increment(ref clientsReliableReceived);
+ Interlocked.Add(ref clientsReliableBytesReceived, netEvent.Packet.Length);
+ } else if (netEvent.ChannelID == 1) {
+ Interlocked.Increment(ref clientsUnreliableReceived);
+ Interlocked.Add(ref clientsUnreliableBytesReceived, netEvent.Packet.Length);
+ }
- netEvent.Packet.Dispose();
+ netEvent.Packet.Dispose();
- break;
+ break;
+ }
}
- }
- peer.Disconnect(0);
+ peer.Disconnect(0);
+ }
}, TaskCreationOptions.LongRunning);
}
}
@@ -817,6 +1056,8 @@ public static void Server() {
Interlocked.Increment(ref serverUnreliableSent);
Interlocked.Add(ref serverUnreliableBytesSent, reversedData.Length);
}
+
+ reader.Recycle();
};
while (processActive) {
@@ -904,6 +1145,8 @@ await Task.Factory.StartNew(() => {
Interlocked.Increment(ref clientsUnreliableReceived);
Interlocked.Add(ref clientsUnreliableBytesReceived, reader.AvailableBytes);
}
+
+ reader.Recycle();
};
while (processActive) {
@@ -1363,7 +1606,7 @@ public static void Server() {
server.Connect(ip + ":" + port, title);
listener.OnConnected += () => {
- Thread.Sleep(Timeout.Infinite);
+ Environment.Exit(0);
};
listener.OnDisconnected += () => {
From 80270e21c12f614fd3fc6160fb9aa47e04d1fef5 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 18 Sep 2018 20:53:19 +0500
Subject: [PATCH 130/159] Update README.md
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 0ac7c9c..d704135 100644
--- a/README.md
+++ b/README.md
@@ -11,9 +11,10 @@ Features:
- Stable under high-loads
- Simple and flexible simulation setup
- Detailed session information
+- Multi-process instances
Supported networking libraries:
-- [ENet](https://github.com/lsalzman/enet "ENet") ([C# Wrapper](https://github.com/NateShoffner/ENetSharp "C# Wrapper"))
+- [ENet](https://github.com/nxrighthere/ENet-CSharp "ENet")
- [UNet](https://forum.unity.com/threads/standalone-library-binaries-aka-server-dll.526718 "UNet")
- [LiteNetLib](https://github.com/RevenantX/LiteNetLib "LiteNetLib")
- [Lidgren](https://github.com/lidgren/lidgren-network-gen3 "Lidgren")
@@ -31,7 +32,7 @@ Each simulated client is one asynchronous task for establishing a connection wit
Usage
--------
-Run the application and enter the desired parameters to override the default values. Do not perform any actions while the benchmark is running and wait until the process is complete.
+Run the application, select the networking library and set the number of simulated clients to override the default value. Do not perform any actions while the benchmark is running and wait until the process is complete.
When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) from Server GC to Workstation GC. You can find more information in [this article](https://blogs.msdn.microsoft.com/seteplia/2017/01/05/understanding-different-gc-modes-with-concurrency-visualizer/) about how different GC modes are working.
From f1ce2c07c71b82caf8ed53bd02adac170c1d5eef Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 18 Sep 2018 20:55:15 +0500
Subject: [PATCH 131/159] Minor changes
---
BenchmarkNet.cs | 26 +++++++++-----------------
1 file changed, 9 insertions(+), 17 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 6b50ec7..203e907 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -82,10 +82,6 @@ public abstract class BenchmarkNet {
public static bool processOverload = false;
public static bool processUninitialized = true;
// Stats
- public static volatile int clientsStartedCount = 0;
- public static volatile int clientsConnectedCount = 0;
- public static volatile int clientsStreamsCount = 0;
- public static volatile int clientsDisconnectedCount = 0;
public static volatile int serverReliableSent = 0;
public static volatile int serverReliableReceived = 0;
public static volatile int serverReliableBytesSent = 0;
@@ -94,6 +90,10 @@ public abstract class BenchmarkNet {
public static volatile int serverUnreliableReceived = 0;
public static volatile int serverUnreliableBytesSent = 0;
public static volatile int serverUnreliableBytesReceived = 0;
+ public static volatile int clientsStartedCount = 0;
+ public static volatile int clientsConnectedCount = 0;
+ public static volatile int clientsStreamsCount = 0;
+ public static volatile int clientsDisconnectedCount = 0;
public static volatile int clientsReliableSent = 0;
public static volatile int clientsReliableReceived = 0;
public static volatile int clientsReliableBytesSent = 0;
@@ -442,7 +442,6 @@ await Task.Factory.StartNew(() => {
while (processActive) {
if (serverInstance) {
- serverMessage.uninitialized = processUninitialized;
serverMessage.uninitialized = processUninitialized;
serverMessage.reliableSent = serverReliableSent;
serverMessage.reliableReceived = serverReliableReceived;
@@ -1563,19 +1562,10 @@ private class PhotonPeerListener : IPhotonPeerListener {
public void OnMessage(object message) {
byte[] data = (byte[])message;
- if (data[0] == messageData[0]) {
- Interlocked.Increment(ref serverReliableReceived);
- Interlocked.Add(ref serverReliableBytesReceived, data.Length);
- Interlocked.Increment(ref serverReliableSent);
- Interlocked.Add(ref serverReliableBytesSent, data.Length);
+ if (data[0] == messageData[0])
OnReliableReceived(data);
- } else if (data[0] == reversedData[0]) {
- Interlocked.Increment(ref serverUnreliableReceived);
- Interlocked.Add(ref serverUnreliableBytesReceived, data.Length);
- Interlocked.Increment(ref serverUnreliableSent);
- Interlocked.Add(ref serverUnreliableBytesSent, data.Length);
+ else if (data[0] == reversedData[0])
OnUnreliableReceived(data);
- }
}
public void OnStatusChanged(StatusCode statusCode) {
@@ -1606,7 +1596,7 @@ public static void Server() {
server.Connect(ip + ":" + port, title);
listener.OnConnected += () => {
- Environment.Exit(0);
+ Thread.Sleep(Timeout.Infinite);
};
listener.OnDisconnected += () => {
@@ -1766,6 +1756,8 @@ public static async Task Client() {
await Task.Factory.StartNew(() => {
Node client = new Node(Task.CurrentId.ToString(), ip, port, typeof(NeutrinoBenchmark).Assembly);
+ NeutrinoConfig.PeerTimeoutMillis = ((Math.Max(reliableMessages, unreliableMessages) / sendRate) * 2) * 1000;
+
int reliableToSend = 0;
int unreliableToSend = 0;
int reliableSentCount = 0;
From 0dc7e690c54b158b468386fb8e9c29a48cb76dcf Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 18 Sep 2018 20:58:02 +0500
Subject: [PATCH 132/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d704135..1dcdee1 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ Each simulated client is one asynchronous task for establishing a connection wit
Usage
--------
-Run the application, select the networking library and set the number of simulated clients to override the default value. Do not perform any actions while the benchmark is running and wait until the process is complete.
+Before launching the application set the desired parameters in the [config file](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options) to override the default values. Run the application, select the networking library and set any number of simulated clients. Do not perform any actions while the benchmark is running and wait until the process is complete.
When you are going to perform a test with less than 256 simulated clients, it's highly recommended to switch [GC mode](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options#gc-mode) from Server GC to Workstation GC. You can find more information in [this article](https://blogs.msdn.microsoft.com/seteplia/2017/01/05/understanding-different-gc-modes-with-concurrency-visualizer/) about how different GC modes are working.
From 459d0ba082ec7ece19817d2f1d2ee1fa760989d8 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 18 Sep 2018 22:57:17 +0500
Subject: [PATCH 133/159] Minor improvements
---
BenchmarkNet.cs | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 203e907..44a2bca 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -265,7 +265,7 @@ public static bool Initialize() {
processActive = true;
if (serverInstance || clientsInstance) {
- if (selectedLibrary == 0)
+ if (selectedLibrary == Array.FindIndex(networkingLibraries, entry => entry.Contains("ENet")))
ENet.Library.Initialize();
}
@@ -301,7 +301,7 @@ public static bool Initialize() {
}
Task pulseTask = Pulse();
- Task dataTask = Data();
+ Task dataTask = serverInstance && selectedLibrary == Array.FindIndex(networkingLibraries, entry => entry.Contains("Photon")) ? null : Data();
#if !GUI
Task infoTask = serverInstance || clientsInstance ? null : Info();
@@ -317,8 +317,8 @@ public static bool Initialize() {
}
private static void Deinitialize() {
- serverProcess.Kill();
- clientsProcess.Kill();
+ serverProcess.Close();
+ clientsProcess.Close();
}
[STAThread]
@@ -658,7 +658,7 @@ await Task.Factory.StartNew(() => {
}
if (serverInstance || clientsInstance) {
- if (selectedLibrary == 0)
+ if (selectedLibrary == Array.FindIndex(networkingLibraries, entry => entry.Contains("ENet")))
ENet.Library.Deinitialize();
}
}, TaskCreationOptions.LongRunning);
From 0e8a42376824c31257f1e74480687ca6596a193a Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Wed, 19 Sep 2018 01:43:19 +0500
Subject: [PATCH 134/159] Fix termination of instances
---
BenchmarkNet.cs | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 44a2bca..f503d20 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -317,8 +317,11 @@ public static bool Initialize() {
}
private static void Deinitialize() {
- serverProcess.Close();
- clientsProcess.Close();
+ if (!serverProcess.HasExited)
+ serverProcess.Kill();
+
+ if (!clientsProcess.HasExited)
+ clientsProcess.Kill();
}
[STAThread]
From cebeef3a27bddd660f0e54a91c9760d1793e4919 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 20 Sep 2018 20:15:41 +0500
Subject: [PATCH 135/159] Update to 1.10-N2 version
---
BenchmarkNet.cs | 75 ++++++++++++++++++++-----------------------------
1 file changed, 31 insertions(+), 44 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index f503d20..20b6d69 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -115,28 +115,26 @@ public abstract class BenchmarkNet {
"DarkRift"
};
// Data
- protected static char[] reversedMessage;
protected static byte[] messageData;
protected static byte[] reversedData;
+ protected static char[] reversedMessage;
// Internals
private static bool serverInstance = false;
private static bool clientsInstance = false;
private static bool maxClientsPass = true;
private static bool sustainedLowLatency = false;
private static ushort maxPeers = 0;
- private static int memoryLength = 512;
private static BinaryFormatter binaryFormatter;
private static Thread serverThread;
private static ServerMessage serverMessage;
private static ClientsMessage clientsMessage;
- private static MemoryMappedFile serverData;
- private static MemoryMappedFile clientsData;
private static MemoryMappedViewStream serverStream;
private static MemoryMappedViewStream clientsStream;
- private static NamedPipeServerStream masterPipeServer;
- private static NamedPipeServerStream masterPipeClients;
+ private static NamedPipeServerStream serverPipe;
+ private static NamedPipeServerStream clientsPipe;
private static Process serverProcess;
private static Process clientsProcess;
+ private const int memoryMappedLength = 512;
private const ushort defaultPort = 9500;
private const ushort defaultMaxClients = 1000;
private const int defaultServerTickRate = 64;
@@ -147,7 +145,7 @@ public abstract class BenchmarkNet {
private const string defaultMessage = "Sometimes we just need a good networking library";
// Functions
#if !GUI
- private static readonly Func Space = (value) => (String.Empty.PadRight(value));
+ private static readonly Func Space = (value) => String.Empty.PadRight(value);
private static readonly Func PayloadThroughput = (clientsStreamsCount, messageLength, sendRate) => (clientsStreamsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
#else
@@ -185,13 +183,15 @@ private struct ClientsMessage {
public static bool Initialize() {
binaryFormatter = new BinaryFormatter();
- serverData = MemoryMappedFile.CreateOrOpen(title + "ServerData", memoryLength, MemoryMappedFileAccess.ReadWrite);
- serverStream = serverData.CreateViewStream(0, memoryLength);
+ MemoryMappedFile serverData = MemoryMappedFile.CreateOrOpen(title + "ServerData", memoryMappedLength, MemoryMappedFileAccess.ReadWrite);
+
+ serverStream = serverData.CreateViewStream(0, memoryMappedLength);
binaryFormatter.Serialize(serverStream, serverMessage);
serverStream.Seek(0, SeekOrigin.Begin);
- clientsData = MemoryMappedFile.CreateOrOpen(title + "ClientsData", memoryLength, MemoryMappedFileAccess.ReadWrite);
- clientsStream = clientsData.CreateViewStream(0, memoryLength);
+ MemoryMappedFile clientsData = MemoryMappedFile.CreateOrOpen(title + "ClientsData", memoryMappedLength, MemoryMappedFileAccess.ReadWrite);
+
+ clientsStream = clientsData.CreateViewStream(0, memoryMappedLength);
binaryFormatter.Serialize(clientsStream, clientsMessage);
clientsStream.Seek(0, SeekOrigin.Begin);
@@ -317,6 +317,8 @@ public static bool Initialize() {
}
private static void Deinitialize() {
+ processActive = false;
+
if (!serverProcess.HasExited)
serverProcess.Kill();
@@ -389,16 +391,11 @@ private static void Main(string[] arguments) {
if (!Initialize()) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Initialization failed!");
- Console.ReadKey();
- processActive = false;
- Environment.Exit(0);
}
Console.ReadKey();
#endif
- processActive = false;
-
Deinitialize();
Environment.Exit(0);
@@ -410,26 +407,26 @@ await Task.Factory.StartNew(() => {
const string clientsPipeName = title + "Clients";
if (serverInstance) {
- NamedPipeClientStream serverPipe = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
+ NamedPipeClientStream serverPipeStream = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
- serverPipe.Connect();
- serverPipe.BeginRead(new byte[1], 0, 1, (result) => { Environment.Exit(0); }, serverPipe);
+ serverPipeStream.Connect();
+ serverPipeStream.BeginRead(new byte[1], 0, 1, (result) => Environment.Exit(0), serverPipeStream);
} else if (clientsInstance) {
- NamedPipeClientStream clientsPipe = new NamedPipeClientStream(".", clientsPipeName, PipeDirection.In);
+ NamedPipeClientStream clientsPipeStream = new NamedPipeClientStream(".", clientsPipeName, PipeDirection.In);
- clientsPipe.Connect();
- clientsPipe.BeginRead(new byte[1], 0, 1, (result) => { Environment.Exit(0); }, clientsPipe);
+ clientsPipeStream.Connect();
+ clientsPipeStream.BeginRead(new byte[1], 0, 1, (result) => Environment.Exit(0), clientsPipeStream);
} else {
Task.Run(async() => {
- masterPipeServer = new NamedPipeServerStream(serverPipeName, PipeDirection.Out);
+ serverPipe = new NamedPipeServerStream(serverPipeName, PipeDirection.Out);
- await masterPipeServer.WaitForConnectionAsync();
+ await serverPipe.WaitForConnectionAsync();
});
Task.Run(async() => {
- masterPipeClients = new NamedPipeServerStream(clientsPipeName, PipeDirection.Out);
+ clientsPipe = new NamedPipeServerStream(clientsPipeName, PipeDirection.Out);
- await masterPipeClients.WaitForConnectionAsync();
+ await clientsPipe.WaitForConnectionAsync();
});
}
}, TaskCreationOptions.LongRunning);
@@ -437,11 +434,8 @@ await Task.Factory.StartNew(() => {
private static async Task Data() {
await Task.Factory.StartNew(() => {
- byte[] serverBuffer = serverInstance || clientsInstance ? null : new byte[memoryLength];
- byte[] clientsBuffer = serverInstance || clientsInstance ? null : new byte[memoryLength];
-
- serverMessage = default(ServerMessage);
- clientsMessage = default(ClientsMessage);
+ byte[] serverBuffer = serverInstance || clientsInstance ? null : new byte[memoryMappedLength];
+ byte[] clientsBuffer = serverInstance || clientsInstance ? null : new byte[memoryMappedLength];
while (processActive) {
if (serverInstance) {
@@ -474,8 +468,8 @@ await Task.Factory.StartNew(() => {
binaryFormatter.Serialize(clientsStream, clientsMessage);
clientsStream.Seek(0, SeekOrigin.Begin);
} else {
- serverStream.Read(serverBuffer, 0, memoryLength);
- clientsStream.Read(clientsBuffer, 0, memoryLength);
+ serverStream.Read(serverBuffer, 0, memoryMappedLength);
+ clientsStream.Read(clientsBuffer, 0, memoryMappedLength);
using (MemoryStream stream = new MemoryStream(serverBuffer)) {
serverMessage = (ServerMessage)binaryFormatter.Deserialize(stream);
@@ -650,7 +644,6 @@ await Task.Factory.StartNew(() => {
processCompleted = true;
Thread.Sleep(100);
- processActive = false;
Deinitialize();
@@ -1040,9 +1033,7 @@ public static void Server() {
server.MergeEnabled = true;
server.Start(port);
- listener.ConnectionRequestEvent += (request) => {
- request.AcceptIfKey(title + "Key");
- };
+ listener.ConnectionRequestEvent += (request) => request.AcceptIfKey(title + "Key");
listener.NetworkReceiveEvent += (peer, reader, deliveryMethod) => {
if (deliveryMethod == DeliveryMethod.ReliableOrdered) {
@@ -1179,6 +1170,7 @@ public static void Server() {
config.MaximumConnections = maxClients;
NetServer server = new NetServer(config);
+
server.Start();
NetIncomingMessage netMessage;
@@ -1598,13 +1590,8 @@ public static void Server() {
server.Connect(ip + ":" + port, title);
- listener.OnConnected += () => {
- Thread.Sleep(Timeout.Infinite);
- };
-
- listener.OnDisconnected += () => {
- processFailure = true;
- };
+ listener.OnConnected += () => Thread.Sleep(Timeout.Infinite);
+ listener.OnDisconnected += () => processFailure = true;
while (processActive) {
server.Service();
From 45487ec78d8ad1fb8bdb3235ed75949e09807b0b Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 20 Sep 2018 21:35:06 +0500
Subject: [PATCH 136/159] Fix channels for Photon client
---
BenchmarkNet.cs | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 20b6d69..99d36eb 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -1606,6 +1606,7 @@ await Task.Factory.StartNew(() => {
PhotonPeerListener listener = new PhotonPeerListener();
PhotonPeer client = new PhotonPeer(listener, ConnectionProtocol.Udp);
+ client.ChannelCount = 4;
client.Connect(ip + ":" + port, title);
int reliableToSend = 0;
@@ -1619,7 +1620,7 @@ await Task.Factory.StartNew(() => {
while (processActive) {
if (reliableToSend > 0) {
- client.SendMessage(messageData, true, 0, false);
+ client.SendMessage(messageData, true, 2, false);
Interlocked.Decrement(ref reliableToSend);
Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
@@ -1627,7 +1628,7 @@ await Task.Factory.StartNew(() => {
}
if (unreliableToSend > 0) {
- client.SendMessage(reversedData, false, 1, false);
+ client.SendMessage(reversedData, false, 3, false);
Interlocked.Decrement(ref unreliableToSend);
Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
From ac4b61dab73f1d56ccc81b4a26af9ff354604e85 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 22 Sep 2018 18:18:48 +0500
Subject: [PATCH 137/159] Minor reordering
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 99d36eb..746b1c4 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -125,7 +125,6 @@ public abstract class BenchmarkNet {
private static bool sustainedLowLatency = false;
private static ushort maxPeers = 0;
private static BinaryFormatter binaryFormatter;
- private static Thread serverThread;
private static ServerMessage serverMessage;
private static ClientsMessage clientsMessage;
private static MemoryMappedViewStream serverStream;
@@ -134,6 +133,7 @@ public abstract class BenchmarkNet {
private static NamedPipeServerStream clientsPipe;
private static Process serverProcess;
private static Process clientsProcess;
+ private static Thread serverThread;
private const int memoryMappedLength = 512;
private const ushort defaultPort = 9500;
private const ushort defaultMaxClients = 1000;
From 8ad0ba51d4df6c9e30ede0684b319b264f7fb964 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Sat, 22 Sep 2018 18:28:40 +0500
Subject: [PATCH 138/159] Update README.md
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 1dcdee1..4cd16e6 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,8 @@ Feel free to join the discussion in the [thread](https://forum.unity.com/threads
If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "email").
+Please, check [this](https://github.com/nxrighthere/BenchmarkNet/issues?q=is%3Aissue+is%3Aclosed) section before opening a new issue.
+
Donations
--------
This project has already had an impact and helped developers in an improvement of the networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
From 2c5190ee88afdf6ecdf08f2b6eead42fd9a339a5 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 27 Sep 2018 23:13:31 +0500
Subject: [PATCH 139/159] Enforce coherence across tasks and processes
---
BenchmarkNet.cs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 746b1c4..77d737a 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -75,12 +75,12 @@ public abstract class BenchmarkNet {
public static int unreliableMessages = 0;
public static string message = String.Empty;
// Status
- public static bool processActive = false;
- public static bool processCompleted = false;
- public static bool processCrashed = false;
- public static bool processFailure = false;
- public static bool processOverload = false;
- public static bool processUninitialized = true;
+ public static volatile bool processActive = false;
+ public static volatile bool processCompleted = false;
+ public static volatile bool processCrashed = false;
+ public static volatile bool processFailure = false;
+ public static volatile bool processOverload = false;
+ public static volatile bool processUninitialized = true;
// Stats
public static volatile int serverReliableSent = 0;
public static volatile int serverReliableReceived = 0;
@@ -410,12 +410,12 @@ await Task.Factory.StartNew(() => {
NamedPipeClientStream serverPipeStream = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
serverPipeStream.Connect();
- serverPipeStream.BeginRead(new byte[1], 0, 1, (result) => Environment.Exit(0), serverPipeStream);
+ serverPipeStream.BeginRead(new byte[1], 0, 1, (result) => Process.GetCurrentProcess().Kill(), serverPipeStream);
} else if (clientsInstance) {
NamedPipeClientStream clientsPipeStream = new NamedPipeClientStream(".", clientsPipeName, PipeDirection.In);
clientsPipeStream.Connect();
- clientsPipeStream.BeginRead(new byte[1], 0, 1, (result) => Environment.Exit(0), clientsPipeStream);
+ clientsPipeStream.BeginRead(new byte[1], 0, 1, (result) => Process.GetCurrentProcess().Kill(), clientsPipeStream);
} else {
Task.Run(async() => {
serverPipe = new NamedPipeServerStream(serverPipeName, PipeDirection.Out);
From 9822e0ec16e9da13152e8ce3a4498676dd00b132 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Fri, 28 Sep 2018 01:06:01 +0500
Subject: [PATCH 140/159] Eliminate explicit new reference type allocations
---
BenchmarkNet.cs | 63 ++++++++++++++++++++++++-------------------------
1 file changed, 31 insertions(+), 32 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 77d737a..d90ed8c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -434,8 +434,11 @@ await Task.Factory.StartNew(() => {
private static async Task Data() {
await Task.Factory.StartNew(() => {
- byte[] serverBuffer = serverInstance || clientsInstance ? null : new byte[memoryMappedLength];
- byte[] clientsBuffer = serverInstance || clientsInstance ? null : new byte[memoryMappedLength];
+ bool monitoringInstance = !serverInstance && !clientsInstance;
+ byte[] serverBuffer = !monitoringInstance ? null : new byte[memoryMappedLength];
+ byte[] clientsBuffer = !monitoringInstance ? null : new byte[memoryMappedLength];
+ MemoryStream serverMemory = !monitoringInstance ? null : new MemoryStream(serverBuffer);
+ MemoryStream clientsMemory = !monitoringInstance ? null : new MemoryStream(clientsBuffer);
while (processActive) {
if (serverInstance) {
@@ -471,36 +474,32 @@ await Task.Factory.StartNew(() => {
serverStream.Read(serverBuffer, 0, memoryMappedLength);
clientsStream.Read(clientsBuffer, 0, memoryMappedLength);
- using (MemoryStream stream = new MemoryStream(serverBuffer)) {
- serverMessage = (ServerMessage)binaryFormatter.Deserialize(stream);
-
- processUninitialized = serverMessage.uninitialized;
- serverReliableSent = serverMessage.reliableSent;
- serverReliableReceived = serverMessage.reliableReceived;
- serverReliableBytesSent = serverMessage.reliableBytesSent;
- serverReliableBytesReceived = serverMessage.reliableBytesReceived;
- serverUnreliableSent = serverMessage.unreliableSent;
- serverUnreliableReceived = serverMessage.unreliableReceived;
- serverUnreliableBytesSent = serverMessage.unreliableBytesSent;
- serverUnreliableBytesReceived = serverMessage.unreliableBytesReceived;
- }
-
- using (MemoryStream stream = new MemoryStream(clientsBuffer)) {
- clientsMessage = (ClientsMessage)binaryFormatter.Deserialize(stream);
-
- clientsStartedCount = clientsMessage.StartedCount;
- clientsConnectedCount = clientsMessage.ConnectedCount;
- clientsStreamsCount = clientsMessage.StreamsCount;
- clientsDisconnectedCount = clientsMessage.DisconnectedCount;
- clientsReliableSent = clientsMessage.ReliableSent;
- clientsReliableReceived = clientsMessage.ReliableReceived;
- clientsReliableBytesSent = clientsMessage.ReliableBytesSent;
- clientsReliableBytesReceived = clientsMessage.ReliableBytesReceived;
- clientsUnreliableSent = clientsMessage.UnreliableSent;
- clientsUnreliableReceived = clientsMessage.UnreliableReceived;
- clientsUnreliableBytesSent = clientsMessage.UnreliableBytesSent;
- clientsUnreliableBytesReceived = clientsMessage.UnreliableBytesReceived;
- }
+ serverMessage = (ServerMessage)binaryFormatter.Deserialize(serverMemory);
+ processUninitialized = serverMessage.uninitialized;
+ serverReliableSent = serverMessage.reliableSent;
+ serverReliableReceived = serverMessage.reliableReceived;
+ serverReliableBytesSent = serverMessage.reliableBytesSent;
+ serverReliableBytesReceived = serverMessage.reliableBytesReceived;
+ serverUnreliableSent = serverMessage.unreliableSent;
+ serverUnreliableReceived = serverMessage.unreliableReceived;
+ serverUnreliableBytesSent = serverMessage.unreliableBytesSent;
+ serverUnreliableBytesReceived = serverMessage.unreliableBytesReceived;
+ serverMemory.Seek(0, SeekOrigin.Begin);
+
+ clientsMessage = (ClientsMessage)binaryFormatter.Deserialize(clientsMemory);
+ clientsStartedCount = clientsMessage.StartedCount;
+ clientsConnectedCount = clientsMessage.ConnectedCount;
+ clientsStreamsCount = clientsMessage.StreamsCount;
+ clientsDisconnectedCount = clientsMessage.DisconnectedCount;
+ clientsReliableSent = clientsMessage.ReliableSent;
+ clientsReliableReceived = clientsMessage.ReliableReceived;
+ clientsReliableBytesSent = clientsMessage.ReliableBytesSent;
+ clientsReliableBytesReceived = clientsMessage.ReliableBytesReceived;
+ clientsUnreliableSent = clientsMessage.UnreliableSent;
+ clientsUnreliableReceived = clientsMessage.UnreliableReceived;
+ clientsUnreliableBytesSent = clientsMessage.UnreliableBytesSent;
+ clientsUnreliableBytesReceived = clientsMessage.UnreliableBytesReceived;
+ clientsMemory.Seek(0, SeekOrigin.Begin);
serverStream.Seek(0, SeekOrigin.Begin);
clientsStream.Seek(0, SeekOrigin.Begin);
From 96f4c7a48ce14a9c227954490775fd23f5b94132 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Tue, 9 Oct 2018 18:59:17 +0500
Subject: [PATCH 141/159] Simplify memory stream position reset
---
BenchmarkNet.cs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index d90ed8c..897f01c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -187,13 +187,13 @@ public static bool Initialize() {
serverStream = serverData.CreateViewStream(0, memoryMappedLength);
binaryFormatter.Serialize(serverStream, serverMessage);
- serverStream.Seek(0, SeekOrigin.Begin);
+ serverStream.Position = 0;
MemoryMappedFile clientsData = MemoryMappedFile.CreateOrOpen(title + "ClientsData", memoryMappedLength, MemoryMappedFileAccess.ReadWrite);
clientsStream = clientsData.CreateViewStream(0, memoryMappedLength);
binaryFormatter.Serialize(clientsStream, clientsMessage);
- clientsStream.Seek(0, SeekOrigin.Begin);
+ clientsStream.Position = 0;
if (serverInstance) {
if (selectedLibrary == 0)
@@ -453,7 +453,7 @@ await Task.Factory.StartNew(() => {
serverMessage.unreliableBytesReceived = serverUnreliableBytesReceived;
binaryFormatter.Serialize(serverStream, serverMessage);
- serverStream.Seek(0, SeekOrigin.Begin);
+ serverStream.Position = 0;
} else if (clientsInstance) {
clientsMessage.StartedCount = clientsStartedCount;
clientsMessage.ConnectedCount = clientsConnectedCount;
@@ -469,7 +469,7 @@ await Task.Factory.StartNew(() => {
clientsMessage.UnreliableBytesReceived = clientsUnreliableBytesReceived;
binaryFormatter.Serialize(clientsStream, clientsMessage);
- clientsStream.Seek(0, SeekOrigin.Begin);
+ clientsStream.Position = 0;
} else {
serverStream.Read(serverBuffer, 0, memoryMappedLength);
clientsStream.Read(clientsBuffer, 0, memoryMappedLength);
@@ -484,7 +484,7 @@ await Task.Factory.StartNew(() => {
serverUnreliableReceived = serverMessage.unreliableReceived;
serverUnreliableBytesSent = serverMessage.unreliableBytesSent;
serverUnreliableBytesReceived = serverMessage.unreliableBytesReceived;
- serverMemory.Seek(0, SeekOrigin.Begin);
+ serverMemory.Position = 0;
clientsMessage = (ClientsMessage)binaryFormatter.Deserialize(clientsMemory);
clientsStartedCount = clientsMessage.StartedCount;
@@ -499,10 +499,10 @@ await Task.Factory.StartNew(() => {
clientsUnreliableReceived = clientsMessage.UnreliableReceived;
clientsUnreliableBytesSent = clientsMessage.UnreliableBytesSent;
clientsUnreliableBytesReceived = clientsMessage.UnreliableBytesReceived;
- clientsMemory.Seek(0, SeekOrigin.Begin);
+ clientsMemory.Position = 0;
- serverStream.Seek(0, SeekOrigin.Begin);
- clientsStream.Seek(0, SeekOrigin.Begin);
+ serverStream.Position = 0;
+ clientsStream.Position = 0;
}
Thread.Sleep(15);
From 5e692c8e3fa9441ff3dc540fee1db6ee79cd0ef6 Mon Sep 17 00:00:00 2001
From: nxrighthere
Date: Thu, 11 Oct 2018 15:36:09 +0500
Subject: [PATCH 142/159] Fix order of input handlers
---
BenchmarkNet.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 897f01c..72549d6 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -374,18 +374,18 @@ private static void Main(string[] arguments) {
Console.Write(Environment.NewLine + "Enter the number (default 0): ");
Byte.TryParse(Console.ReadLine(), out selectedLibrary);
- Console.Write("Simulated clients (default " + defaultMaxClients + "): ");
- UInt16.TryParse(Console.ReadLine(), out maxClients);
-
if (selectedLibrary >= networkingLibraries.Length) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Please, enter a valid number of the networking library!");
- Console.ReadKey();
Console.ResetColor();
+ Console.ReadKey();
Console.Clear();
goto Start;
}
+
+ Console.Write("Simulated clients (default " + defaultMaxClients + "): ");
+ UInt16.TryParse(Console.ReadLine(), out maxClients);
}
if (!Initialize()) {
From 633602b9e3dd6a104390db62124aa518380f59fb Mon Sep 17 00:00:00 2001
From: NX
Date: Thu, 25 Oct 2018 20:40:33 +0500
Subject: [PATCH 143/159] Fix incorrect calculation of payload throughput
This bug revealed after separation of the server and clients instances
---
BenchmarkNet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 72549d6..1e8805c 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -146,7 +146,7 @@ public abstract class BenchmarkNet {
// Functions
#if !GUI
private static readonly Func Space = (value) => String.Empty.PadRight(value);
- private static readonly Func PayloadThroughput = (clientsStreamsCount, messageLength, sendRate) => (clientsStreamsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000)) * 2;
+ private static readonly Func PayloadThroughput = (clientsStreamsCount, messageLength, sendRate) => (clientsStreamsCount * (messageLength * sendRate * 2) * 8 / (1000 * 1000));
#else
#endif
From 9969c0009c5cdfd37abdc28d12b7763b8efe4d6f Mon Sep 17 00:00:00 2001
From: NX
Date: Sun, 4 Nov 2018 19:50:37 +0500
Subject: [PATCH 144/159] Update README.md
---
README.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/README.md b/README.md
index 4cd16e6..42c6b33 100644
--- a/README.md
+++ b/README.md
@@ -30,6 +30,16 @@ How it works?
--------
Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which work independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
+Quality control
+--------
+The application helps to determine many various problems:
+- Memory leaks
+- Deadlocks
+- Buffers exhaustion
+- Connections disruption
+- GC pressure
+- Bugs
+
Usage
--------
Before launching the application set the desired parameters in the [config file](https://github.com/nxrighthere/BenchmarkNet/wiki/Advanced-Options) to override the default values. Run the application, select the networking library and set any number of simulated clients. Do not perform any actions while the benchmark is running and wait until the process is complete.
From c6f927ac3b9109a0a7b809ab36f9c65dde0ab1af Mon Sep 17 00:00:00 2001
From: NX
Date: Tue, 13 Nov 2018 14:46:31 +0500
Subject: [PATCH 145/159] Use fluent design for building the info string
---
BenchmarkNet.cs | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 1e8805c..932b7f7 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -570,22 +570,23 @@ await Task.Factory.StartNew(() => {
Console.ResetColor();
}
- info.Clear();
- info.AppendLine().Append("[Server]");
- info.AppendLine().Append("Status: ").Append(processCrashed ? status[1] : (processFailure ? status[2] : (processOverload ? status[3] : (processCompleted ? status[4] : (processUninitialized ? status[5] : status[0])))));
- info.AppendLine().Append("Sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)");
- info.AppendLine().Append("Received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)");
- info.AppendLine().Append("Payload throughput: ").Append(PayloadThroughput(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadThroughput(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(space);
- info.AppendLine();
- info.AppendLine().Append("[Clients]");
- info.AppendLine().Append("Status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped");
- info.AppendLine().Append("Sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)");
- info.AppendLine().Append("Received <- Reliable: ").Append(clientsReliableReceived).Append(" messages (").Append(clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append(clientsUnreliableReceived).Append(" messages (").Append(clientsUnreliableBytesReceived).Append(" bytes)");
- info.AppendLine();
- info.AppendLine().Append("[Summary]");
- info.AppendLine().Append("Total - Reliable: ").Append((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived).Append(" messages (").Append((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived).Append(" messages (").Append((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived).Append(" bytes)");
- info.AppendLine().Append("Expected - Reliable: ").Append(maxClients * (ulong)reliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4).Append(" bytes), Unreliable: ").Append(maxClients * (ulong)unreliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4).Append(" bytes)");
- info.AppendLine().Append("Elapsed time: ").Append(elapsedTime.Elapsed.Hours.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Minutes.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Seconds.ToString("00"));
+ info.Clear()
+ .AppendLine().Append("[Server]")
+ .AppendLine().Append("Status: ").Append(processCrashed ? status[1] : (processFailure ? status[2] : (processOverload ? status[3] : (processCompleted ? status[4] : (processUninitialized ? status[5] : status[0])))))
+ .AppendLine().Append("Sent -> Reliable: ").Append(serverReliableSent).Append(" messages (").Append(serverReliableBytesSent).Append(" bytes), Unreliable: ").Append(serverUnreliableSent).Append(" messages (").Append(serverUnreliableBytesSent).Append(" bytes)")
+ .AppendLine().Append("Received <- Reliable: ").Append(serverReliableReceived).Append(" messages (").Append(serverReliableBytesReceived).Append(" bytes), Unreliable: ").Append(serverUnreliableReceived).Append(" messages (").Append(serverUnreliableBytesReceived).Append(" bytes)")
+ .AppendLine().Append("Payload throughput: ").Append(PayloadThroughput(clientsStreamsCount, messageData.Length, sendRate).ToString("0.00")).Append(" mbps \\ ").Append(PayloadThroughput(maxClients * 2, messageData.Length, sendRate).ToString("0.00")).Append(" mbps").Append(space)
+ .AppendLine()
+ .AppendLine().Append("[Clients]")
+ .AppendLine().Append("Status: ").Append(clientsStartedCount).Append(" started, ").Append(clientsConnectedCount).Append(" connected, ").Append(clientsDisconnectedCount).Append(" dropped")
+ .AppendLine().Append("Sent -> Reliable: ").Append(clientsReliableSent).Append(" messages (").Append(clientsReliableBytesSent).Append(" bytes), Unreliable: ").Append(clientsUnreliableSent).Append(" messages (").Append(clientsUnreliableBytesSent).Append(" bytes)")
+ .AppendLine().Append("Received <- Reliable: ").Append(clientsReliableReceived).Append(" messages (").Append(clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append(clientsUnreliableReceived).Append(" messages (").Append(clientsUnreliableBytesReceived).Append(" bytes)")
+ .AppendLine()
+ .AppendLine().Append("[Summary]")
+ .AppendLine().Append("Total - Reliable: ").Append((ulong)clientsReliableSent + (ulong)serverReliableReceived + (ulong)serverReliableSent + (ulong)clientsReliableReceived).Append(" messages (").Append((ulong)clientsReliableBytesSent + (ulong)serverReliableBytesReceived + (ulong)serverReliableBytesSent + (ulong)clientsReliableBytesReceived).Append(" bytes), Unreliable: ").Append((ulong)clientsUnreliableSent + (ulong)serverUnreliableReceived + (ulong)serverUnreliableSent + (ulong)clientsUnreliableReceived).Append(" messages (").Append((ulong)clientsUnreliableBytesSent + (ulong)serverUnreliableBytesReceived + (ulong)serverUnreliableBytesSent + (ulong)clientsUnreliableBytesReceived).Append(" bytes)")
+ .AppendLine().Append("Expected - Reliable: ").Append(maxClients * (ulong)reliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)reliableMessages * (ulong)messageData.Length * 4).Append(" bytes), Unreliable: ").Append(maxClients * (ulong)unreliableMessages * 4).Append(" messages (").Append(maxClients * (ulong)unreliableMessages * (ulong)messageData.Length * 4).Append(" bytes)")
+ .AppendLine().Append("Elapsed time: ").Append(elapsedTime.Elapsed.Hours.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Minutes.ToString("00")).Append(":").Append(elapsedTime.Elapsed.Seconds.ToString("00"));
+
Console.WriteLine(info);
if (spinnerTimer >= 10) {
@@ -622,6 +623,7 @@ await Task.Factory.StartNew(() => {
Thread.Sleep(1000);
Collect:
+
currentData = ((decimal)serverReliableSent + (decimal)serverReliableReceived + (decimal)serverUnreliableSent + (decimal)serverUnreliableReceived + (decimal)clientsReliableSent + (decimal)clientsReliableReceived + (decimal)clientsUnreliableSent + (decimal)clientsUnreliableReceived);
if (serverProcess.HasExited)
From 4060ebae32f5ffb87dc8ac553f738b09bc8cdde5 Mon Sep 17 00:00:00 2001
From: NX
Date: Sun, 25 Nov 2018 10:31:08 +0500
Subject: [PATCH 146/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 42c6b33..39ab7aa 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere)
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://discord.gg/ceaWXVw)
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
From c01466bbcb5f23d494b2616cfc0a14f57eccaed7 Mon Sep 17 00:00:00 2001
From: NX
Date: Sun, 9 Dec 2018 20:05:37 +0500
Subject: [PATCH 147/159] Change field names from pascal case to camel case
---
BenchmarkNet.cs | 72 ++++++++++++++++++++++++-------------------------
1 file changed, 36 insertions(+), 36 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 932b7f7..7b06536 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -166,18 +166,18 @@ private struct ServerMessage {
[Serializable]
private struct ClientsMessage {
- public int StartedCount;
- public int ConnectedCount;
- public int StreamsCount;
- public int DisconnectedCount;
- public int ReliableSent;
- public int ReliableReceived;
- public int ReliableBytesSent;
- public int ReliableBytesReceived;
- public int UnreliableSent;
- public int UnreliableReceived;
- public int UnreliableBytesSent;
- public int UnreliableBytesReceived;
+ public int startedCount;
+ public int connectedCount;
+ public int streamsCount;
+ public int disconnectedCount;
+ public int reliableSent;
+ public int reliableReceived;
+ public int reliableBytesSent;
+ public int reliableBytesReceived;
+ public int unreliableSent;
+ public int unreliableReceived;
+ public int unreliableBytesSent;
+ public int unreliableBytesReceived;
}
public static bool Initialize() {
@@ -455,18 +455,18 @@ await Task.Factory.StartNew(() => {
binaryFormatter.Serialize(serverStream, serverMessage);
serverStream.Position = 0;
} else if (clientsInstance) {
- clientsMessage.StartedCount = clientsStartedCount;
- clientsMessage.ConnectedCount = clientsConnectedCount;
- clientsMessage.StreamsCount = clientsStreamsCount;
- clientsMessage.DisconnectedCount = clientsDisconnectedCount;
- clientsMessage.ReliableSent = clientsReliableSent;
- clientsMessage.ReliableReceived = clientsReliableReceived;
- clientsMessage.ReliableBytesSent = clientsReliableBytesSent;
- clientsMessage.ReliableBytesReceived = clientsReliableBytesReceived;
- clientsMessage.UnreliableSent = clientsUnreliableSent;
- clientsMessage.UnreliableReceived = clientsUnreliableReceived;
- clientsMessage.UnreliableBytesSent = clientsUnreliableBytesSent;
- clientsMessage.UnreliableBytesReceived = clientsUnreliableBytesReceived;
+ clientsMessage.startedCount = clientsStartedCount;
+ clientsMessage.connectedCount = clientsConnectedCount;
+ clientsMessage.streamsCount = clientsStreamsCount;
+ clientsMessage.disconnectedCount = clientsDisconnectedCount;
+ clientsMessage.reliableSent = clientsReliableSent;
+ clientsMessage.reliableReceived = clientsReliableReceived;
+ clientsMessage.reliableBytesSent = clientsReliableBytesSent;
+ clientsMessage.reliableBytesReceived = clientsReliableBytesReceived;
+ clientsMessage.unreliableSent = clientsUnreliableSent;
+ clientsMessage.unreliableReceived = clientsUnreliableReceived;
+ clientsMessage.unreliableBytesSent = clientsUnreliableBytesSent;
+ clientsMessage.unreliableBytesReceived = clientsUnreliableBytesReceived;
binaryFormatter.Serialize(clientsStream, clientsMessage);
clientsStream.Position = 0;
@@ -487,18 +487,18 @@ await Task.Factory.StartNew(() => {
serverMemory.Position = 0;
clientsMessage = (ClientsMessage)binaryFormatter.Deserialize(clientsMemory);
- clientsStartedCount = clientsMessage.StartedCount;
- clientsConnectedCount = clientsMessage.ConnectedCount;
- clientsStreamsCount = clientsMessage.StreamsCount;
- clientsDisconnectedCount = clientsMessage.DisconnectedCount;
- clientsReliableSent = clientsMessage.ReliableSent;
- clientsReliableReceived = clientsMessage.ReliableReceived;
- clientsReliableBytesSent = clientsMessage.ReliableBytesSent;
- clientsReliableBytesReceived = clientsMessage.ReliableBytesReceived;
- clientsUnreliableSent = clientsMessage.UnreliableSent;
- clientsUnreliableReceived = clientsMessage.UnreliableReceived;
- clientsUnreliableBytesSent = clientsMessage.UnreliableBytesSent;
- clientsUnreliableBytesReceived = clientsMessage.UnreliableBytesReceived;
+ clientsStartedCount = clientsMessage.startedCount;
+ clientsConnectedCount = clientsMessage.connectedCount;
+ clientsStreamsCount = clientsMessage.streamsCount;
+ clientsDisconnectedCount = clientsMessage.disconnectedCount;
+ clientsReliableSent = clientsMessage.reliableSent;
+ clientsReliableReceived = clientsMessage.reliableReceived;
+ clientsReliableBytesSent = clientsMessage.reliableBytesSent;
+ clientsReliableBytesReceived = clientsMessage.reliableBytesReceived;
+ clientsUnreliableSent = clientsMessage.unreliableSent;
+ clientsUnreliableReceived = clientsMessage.unreliableReceived;
+ clientsUnreliableBytesSent = clientsMessage.unreliableBytesSent;
+ clientsUnreliableBytesReceived = clientsMessage.unreliableBytesReceived;
clientsMemory.Position = 0;
serverStream.Position = 0;
From 93c78d849ed509dce838bedcebd092c517215b73 Mon Sep 17 00:00:00 2001
From: NX
Date: Thu, 27 Dec 2018 19:11:04 +0500
Subject: [PATCH 148/159] Update README.md
---
README.md | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 39ab7aa..2744777 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://discord.gg/ceaWXVw)
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697) [](https://discord.gg/ceaWXVw)
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
@@ -60,10 +60,7 @@ Please, check [this](https://github.com/nxrighthere/BenchmarkNet/issues?q=is%3Ai
Donations
--------
-This project has already had an impact and helped developers in an improvement of the networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere)
-or [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere).
-
-Bitcoin `173ZRNuT4k7ss7rAVmNCZr6hLfFY4DZubU` Litecoin `LhdxsS7AUhUrKMmMyTX1yL4EQp6tzSonDT`
+This project has already had an impact and helped developers in an improvement of the networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere), [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere) or [Coinbase](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697).
Any support is much appreciated.
From ca852a0a1dc1330920333909ea3066aab561bb31 Mon Sep 17 00:00:00 2001
From: NX
Date: Wed, 9 Jan 2019 12:12:28 +0500
Subject: [PATCH 149/159] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 2744777..da5f18a 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ Any support is much appreciated.
Supporters
--------
+These wonderful people make open-source better:
From 2c679785dd7e3323a32c954985cd5489898c6014 Mon Sep 17 00:00:00 2001
From: NX
Date: Wed, 23 Jan 2019 12:29:49 +0500
Subject: [PATCH 150/159] Remove unused stats
---
BenchmarkNet.cs | 36 ------------------------------------
1 file changed, 36 deletions(-)
diff --git a/BenchmarkNet.cs b/BenchmarkNet.cs
index 7b06536..0b1d951 100644
--- a/BenchmarkNet.cs
+++ b/BenchmarkNet.cs
@@ -762,8 +762,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -773,7 +771,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
SendReliable(messageData, 2, peer);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -781,7 +778,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
SendUnreliable(reversedData, 3, peer);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -941,8 +937,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -952,7 +946,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
client.Send(host, connection, reliableChannel, messageData, messageData.Length, out byte sendError);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -960,7 +953,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
client.Send(host, connection, unreliableChannel, reversedData, reversedData.Length, out byte sendError);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1075,8 +1067,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1086,7 +1076,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
connection.Send(messageData, DeliveryMethod.ReliableOrdered);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1094,7 +1083,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
connection.Send(reversedData, DeliveryMethod.Sequenced);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1216,8 +1204,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1227,7 +1213,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
SendReliable(messageData, client.ServerConnection, client.CreateMessage(), 2);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1235,7 +1220,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
SendUnreliable(reversedData, client.ServerConnection, client.CreateMessage(), 3);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1341,8 +1325,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1352,7 +1334,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
connection.QueueNotification(messageData, (ushort)messageData.Length);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1360,7 +1341,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
connection.SendPayload(reversedData, (ushort)reversedData.Length);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1468,8 +1448,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1479,7 +1457,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
client.SendBytes(messageData, SendOption.Reliable);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1487,7 +1464,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
client.SendBytes(reversedData, SendOption.None);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1612,8 +1588,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1623,7 +1597,6 @@ await Task.Factory.StartNew(() => {
if (reliableToSend > 0) {
client.SendMessage(messageData, true, 2, false);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1631,7 +1604,6 @@ await Task.Factory.StartNew(() => {
if (unreliableToSend > 0) {
client.SendMessage(reversedData, false, 3, false);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1752,8 +1724,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1765,7 +1735,6 @@ await Task.Factory.StartNew(() => {
reliableMessage.Message = message;
client.SendToAll(reliableMessage);
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1775,7 +1744,6 @@ await Task.Factory.StartNew(() => {
unreliableMessage.Message = message;
client.SendToAll(unreliableMessage);
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
@@ -1890,8 +1858,6 @@ await Task.Factory.StartNew(() => {
int reliableToSend = 0;
int unreliableToSend = 0;
- int reliableSentCount = 0;
- int unreliableSentCount = 0;
Task.Factory.StartNew(async() => {
bool reliableIncremented = false;
@@ -1907,7 +1873,6 @@ await Task.Factory.StartNew(() => {
}
Interlocked.Decrement(ref reliableToSend);
- Interlocked.Increment(ref reliableSentCount);
Interlocked.Increment(ref clientsReliableSent);
Interlocked.Add(ref clientsReliableBytesSent, messageData.Length);
}
@@ -1921,7 +1886,6 @@ await Task.Factory.StartNew(() => {
}
Interlocked.Decrement(ref unreliableToSend);
- Interlocked.Increment(ref unreliableSentCount);
Interlocked.Increment(ref clientsUnreliableSent);
Interlocked.Add(ref clientsUnreliableBytesSent, reversedData.Length);
}
From 4c97d8c8b586569ba22b44bcb12b25bd32ed92ad Mon Sep 17 00:00:00 2001
From: NX
Date: Tue, 29 Jan 2019 02:31:24 +0500
Subject: [PATCH 151/159] Update README.md
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index da5f18a..fa52e75 100644
--- a/README.md
+++ b/README.md
@@ -28,8 +28,12 @@ You can find the latest benchmark results on the [wiki page](https://github.com/
How it works?
--------
+### Implementation
Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which work independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
+### Parallelism degree
+TPL automatically performs load-balancing of the coarse-grained tasks with awareness of oversubscription for clients. The server process is running with higher priority to let the operating system make optimal decisions.
+
Quality control
--------
The application helps to determine many various problems:
From 99e7d2dcbc59790229601db1bf871260cb197c2e Mon Sep 17 00:00:00 2001
From: NX
Date: Tue, 19 Feb 2019 19:27:16 +0500
Subject: [PATCH 152/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index fa52e75..304ad52 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697) [](https://discord.gg/ceaWXVw)
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697)
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
From f44b7bc350767a9c54ebfc9d53c7c5d1062abb2b Mon Sep 17 00:00:00 2001
From: NX
Date: Sat, 6 Apr 2019 08:54:46 +0500
Subject: [PATCH 153/159] Update README.md
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 304ad52..96daf31 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@
[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697)
+_The application is no longer in active public development, all futher work moved to private, this repository turned into read-only mode for historical reference. It was a great experiment, thanks to all supporters and contributors._
+
BenchmarkNet is a console application for testing the reliable UDP networking solutions.
Features:
From 1c67bd7a49bef5a39111bd106417b71f2b9afa1c Mon Sep 17 00:00:00 2001
From: NX
Date: Mon, 27 May 2019 21:55:58 +0500
Subject: [PATCH 154/159] Create FUNDING.yml
---
.github/FUNDING.yml | 1 +
1 file changed, 1 insertion(+)
create mode 100644 .github/FUNDING.yml
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..aff8904
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+custom: https://salt.bountysource.com/checkout/amount?team=nxrighthere
From 270dab6bdd8690015f9906f3c92469a60b6e7fdc Mon Sep 17 00:00:00 2001
From: NX
Date: Wed, 2 Oct 2019 12:17:09 +0500
Subject: [PATCH 155/159] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 96daf31..9f43db0 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ You can find the latest benchmark results on the [wiki page](https://github.com/
How it works?
--------
### Implementation
-Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients is 1000 tasks with 1000 subtasks which work independently of each other. This sounds scary, but CPU usage is <1% for tasks itself and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
+Each simulated client is one asynchronous task for establishing a connection with the server and processing network events. Each task has one subtask which also works asynchronously to send network messages at a specified interval (15 messages per second by default). So, 1000 simulated clients are 1000 tasks with 1000 subtasks which work independently of each other. This sounds scary, but CPU usage is <1% for tasks itself, and every operation is completely thread-safe. The clients send network messages to the server (500 reliable and 1000 unreliable by default). The server also sends messages to the clients in response (48 bytes per message by default). The application will monitor how the data is processed by the server and clients, and report their status in real-time.
### Parallelism degree
TPL automatically performs load-balancing of the coarse-grained tasks with awareness of oversubscription for clients. The server process is running with higher priority to let the operating system make optimal decisions.
From c9df2be1f0bd253ba3847200ab1d802bdca77e21 Mon Sep 17 00:00:00 2001
From: Stanislav Denisov
Date: Tue, 18 Feb 2020 23:00:03 +0500
Subject: [PATCH 156/159] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 9f43db0..3cc6e88 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697)
+[](https://github.com/nxrighthere/BenchmarkNet/releases) [](https://www.paypal.me/nxrighthere) [](https://salt.bountysource.com/checkout/amount?team=nxrighthere) [](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697)
_The application is no longer in active public development, all futher work moved to private, this repository turned into read-only mode for historical reference. It was a great experiment, thanks to all supporters and contributors._
@@ -74,5 +74,5 @@ Supporters
--------
These wonderful people make open-source better:
-
+
From 3127db3a5067a187331d6c634394172c9e6de5a3 Mon Sep 17 00:00:00 2001
From: Stanislav Denisov
Date: Wed, 1 Apr 2020 08:16:55 +0500
Subject: [PATCH 157/159] Update README.md
---
README.md | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 3cc6e88..e062feb 100644
--- a/README.md
+++ b/README.md
@@ -54,11 +54,9 @@ When you are going to perform a test with less than 256 simulated clients, it's
You can use any packet sniffer to monitor how the data is transmitted, but it may affect the results.
-If you want to simulate a bad network condition, use [Clumsy](http://jagt.github.io/clumsy/ "Clumsy") as an ideal companion.
-
Discussion
--------
-Feel free to join the discussion in the [thread](https://forum.unity.com/threads/benchmarknet-stress-test-for-enet-unet-litenetlib-lidgren-and-miniudp.512507 "thread") on Unity forums.
+You can find the discussion in the [thread](https://forum.unity.com/threads/benchmarknet-stress-test-for-enet-unet-litenetlib-lidgren-and-miniudp.512507 "thread") on Unity forums.
If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "email").
From 690edf7fb11893cb671aba7113ed2100fa4b1092 Mon Sep 17 00:00:00 2001
From: Stanislav Denisov
Date: Mon, 6 Apr 2020 14:08:03 +0500
Subject: [PATCH 158/159] Update README.md
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index e062feb..24f9bcd 100644
--- a/README.md
+++ b/README.md
@@ -60,8 +60,6 @@ You can find the discussion in the [thread](https://forum.unity.com/threads/benc
If you have any questions, contact me via [email](mailto:nxrighthere@gmail.com "email").
-Please, check [this](https://github.com/nxrighthere/BenchmarkNet/issues?q=is%3Aissue+is%3Aclosed) section before opening a new issue.
-
Donations
--------
This project has already had an impact and helped developers in an improvement of the networking libraries. If you like this project, you can support me on [PayPal](https://www.paypal.me/nxrighthere), [Bountysource](https://salt.bountysource.com/checkout/amount?team=nxrighthere) or [Coinbase](https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697).
From 4ef86361bb9d9d605935d29919ee58612ebe3487 Mon Sep 17 00:00:00 2001
From: Stanislav Denisov
Date: Mon, 6 Apr 2020 17:53:41 +0500
Subject: [PATCH 159/159] Update FUNDING.yml
---
.github/FUNDING.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index aff8904..d8abc76 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1 +1 @@
-custom: https://salt.bountysource.com/checkout/amount?team=nxrighthere
+custom: ['https://www.paypal.com/paypalme2/nxrighthere', 'https://salt.bountysource.com/checkout/amount?team=nxrighthere', 'https://money.yandex.ru/to/41001289261209', 'https://commerce.coinbase.com/checkout/03e11816-b6fc-4e14-b974-29a1d0886697']