public static long GetStatistics(string statType) { switch (statType) { case "Ping": return((long)PingMs); case "SentBytes": return(NetworkMain.ClientConnection.Statistics.SentBytes); case "ReceivedBytes": return(NetworkMain.ClientConnection.Statistics.ReceivedBytes); case "Latency": return((long)NetworkMain.ClientConnection.ServerConnection.AverageRoundtripTime); case "TimeOffset": return(TimeOffset); case "LastSendTime": return((long)(LunaNetworkTime.UtcNow - LastSendTime).TotalMilliseconds); case "LastReceiveTime": return((long)(LunaNetworkTime.UtcNow - LastReceiveTime).TotalMilliseconds); case "MessagesInCache": return(MessageStore.GetMessageCount(null)); case "MessageDataInCache": return(MessageStore.GetMessageDataCount(null)); } return(0); }
static void Main(string[] args) { MessageStore <object> ms = new MessageStore <object>(capacity: 80000); ThreadPool.SetMinThreads(32, 32); Console.WriteLine("{0}-bit process", IntPtr.Size * 8); Console.WriteLine("{0} writer(s), {1} reader(s)", NumWriters, NumReaders); Console.WriteLine("Running for {0}..", RunTime); // queue writers for (int writerNum = 0; writerNum < NumWriters; writerNum++) { ThreadPool.QueueUserWorkItem(_ => { for (int i = 0; ; i++) { ms.Add("This is my awesome object!"); } }, null); } // queue readers long totalMessagesRecvd = 0; for (int readerNum = 0; readerNum < NumReaders; readerNum++) { ThreadPool.QueueUserWorkItem(_ => { ulong firstMessageIdToReceive = 0; while (true) { var x = ms.GetMessages(firstMessageIdToReceive); ulong firstMessageIdReceived = x.FirstMessageId; firstMessageIdToReceive = firstMessageIdReceived + (ulong)x.Messages.Length; if (x.Messages.Length > 0) { Interlocked.Add(ref totalMessagesRecvd, x.Messages.Length); } else { // back off if there is no more data Thread.Sleep(10); } } }, null); } // let the program run for 10 seconds Thread.Sleep(RunTime); ulong totalMessagesWritten = ms.GetMessageCount(); Console.WriteLine(); Console.WriteLine("Throughput:"); Console.WriteLine("{0:N0} total messages written", totalMessagesWritten); Console.WriteLine(" ({0:N0} messages per writer per second)", totalMessagesWritten / RunTime.TotalSeconds / NumWriters); Console.WriteLine("{0:N0} total messages received", totalMessagesRecvd); Console.WriteLine(" ({0:N0} messages per reader per second)", totalMessagesRecvd / RunTime.TotalSeconds / NumReaders); }
public void TestMsgMessageStore() { var msg1 = Factory.CreateNew <VesselSrvMsg, VesselPositionMsgData>(); Assert.AreEqual(0, MessageStore.GetMessageCount(typeof(VesselSrvMsg))); Assert.AreEqual(0, MessageStore.GetMessageDataCount(typeof(VesselPositionMsgData))); var msg2 = Factory.CreateNew <VesselSrvMsg, VesselPositionMsgData>(); Assert.AreEqual(0, MessageStore.GetMessageCount(typeof(VesselSrvMsg))); Assert.AreEqual(0, MessageStore.GetMessageDataCount(typeof(VesselPositionMsgData))); //Set first message as "used" msg1.Recycle(); Assert.AreEqual(1, MessageStore.GetMessageCount(typeof(VesselSrvMsg))); Assert.AreEqual(1, MessageStore.GetMessageDataCount(typeof(VesselPositionMsgData))); //If we retrieve a new message the first one should be reused var msg3 = Factory.CreateNew <VesselSrvMsg, VesselPositionMsgData>(); msg2.Recycle(); msg3.Recycle(); Assert.AreEqual(2, MessageStore.GetMessageCount(typeof(VesselSrvMsg))); Assert.AreEqual(2, MessageStore.GetMessageDataCount(typeof(VesselPositionMsgData))); var msg4 = Factory.CreateNew <VesselSrvMsg, VesselPositionMsgData>(); Assert.AreEqual(1, MessageStore.GetMessageCount(typeof(VesselSrvMsg))); Assert.AreEqual(1, MessageStore.GetMessageDataCount(typeof(VesselPositionMsgData))); }
static void Main(string[] args) { MessageStore<object> ms = new MessageStore<object>(capacity: 80000); ThreadPool.SetMinThreads(32, 32); Console.WriteLine("{0}-bit process", IntPtr.Size * 8); Console.WriteLine("{0} writer(s), {1} reader(s)", NumWriters, NumReaders); Console.WriteLine("Running for {0}..", RunTime); // queue writers for (int writerNum = 0; writerNum < NumWriters; writerNum++) { ThreadPool.QueueUserWorkItem(_ => { for (int i = 0; ; i++) { ms.Add("This is my awesome object!"); } }, null); } // queue readers long totalMessagesRecvd = 0; for (int readerNum = 0; readerNum < NumReaders; readerNum++) { ThreadPool.QueueUserWorkItem(_ => { ulong firstMessageIdToReceive = 0; while (true) { var x = ms.GetMessages(firstMessageIdToReceive); ulong firstMessageIdReceived = x.FirstMessageId; firstMessageIdToReceive = firstMessageIdReceived + (ulong)x.Messages.Length; if (x.Messages.Length > 0) { Interlocked.Add(ref totalMessagesRecvd, x.Messages.Length); } else { // back off if there is no more data Thread.Sleep(10); } } }, null); } // let the program run for 10 seconds Thread.Sleep(RunTime); ulong totalMessagesWritten = ms.GetMessageCount(); Console.WriteLine(); Console.WriteLine("Throughput:"); Console.WriteLine("{0:N0} total messages written", totalMessagesWritten); Console.WriteLine(" ({0:N0} messages per writer per second)", totalMessagesWritten / RunTime.TotalSeconds / NumWriters); Console.WriteLine("{0:N0} total messages received", totalMessagesRecvd); Console.WriteLine(" ({0:N0} messages per reader per second)", totalMessagesRecvd / RunTime.TotalSeconds / NumReaders); }