public void RoundTripLwesSerializationOfRandomlyGeneratedEvents() { var t = new { EventsToGenerate = 10000, MaxNumberOfAttributes = 36, Encoding = SupportedEncoding.ISO_8859_1 }; int totalNumberOfAttributes = 0; // Serialization requires an IEventTemplateDB, we're gonna mock it here... var mock = new Mock<IEventTemplateDB>(); Event dummy; mock.Setup(db => db.TryCreateEvent(String.Empty, out dummy, false, t.Encoding)) .Returns(false); SimpleLockFreeQueue<Event> serializationQueue = new SimpleLockFreeQueue<Event>(); SimpleLockFreeQueue<Event> comparisonQueue = new SimpleLockFreeQueue<Event>(); int serializationCount = 0; SimpleLockFreeQueue<byte[]> dataQueue = new SimpleLockFreeQueue<byte[]>(); SimpleLockFreeQueue<Event> deserializationQueue = new SimpleLockFreeQueue<Event>(); int deserializationCount = 0; long totalByteCount = 0; Stopwatch timer = Stopwatch.StartNew(); ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { for (int i = 0; i < t.EventsToGenerate; i++) { Event original = EventUtils.GenerateRandomEvent(String.Concat("MyEvent_", i), t.MaxNumberOfAttributes, t.Encoding); totalNumberOfAttributes += original.AttributeCount; serializationQueue.Enqueue(original); } } )); ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { Event original; while (serializationCount < t.EventsToGenerate) { if (serializationQueue.TryDequeue(out original)) { byte[] data = LwesSerializer.Serialize(original); dataQueue.Enqueue(data); serializationCount++; } } } )); byte[] buffer; while (deserializationCount < t.EventsToGenerate) { if (dataQueue.TryDequeue(out buffer)) { totalByteCount += buffer.Length; Event copy = LwesSerializer.Deserialize(buffer, 0, buffer.Length, mock.Object); deserializationCount++; } else Thread.Sleep(0); } timer.Stop(); Console.Write(String.Concat("Generated ", t.EventsToGenerate, " events in ", timer.Elapsed , " which is ", (t.EventsToGenerate / timer.ElapsedMilliseconds), " per millisecond and " , (totalNumberOfAttributes / timer.ElapsedMilliseconds), " attributes per millisecond.", Environment.NewLine, (totalByteCount / timer.Elapsed.TotalSeconds).ToString("N00"), " bytes per second")); }
static void Main(string[] args) { var arguments = new Arguments(args); bool userChoseToExit = false; int eventCount = 0, incomingCount = 0; Event mostRecent = default(Event); SimpleLockFreeQueue<Event> writeQ = null; var fileName = arguments["f"]; if (!String.IsNullOrEmpty(fileName)) { writeQ = new SimpleLockFreeQueue<Event>(); var dir = Path.GetDirectoryName(fileName); if (!String.IsNullOrEmpty(dir) && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } // Start the file writer... ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { using (var f = File.CreateText(fileName)) { while (!userChoseToExit) { Event ev; while (writeQ.TryDequeue(out ev)) { f.Write(ev.ToString(true)); } Thread.Sleep(200); } } })); } using (IEventListener listener = EventListener.CreateDefault()) { Console.WriteLine("LWES EventListener -\r\n This console will continue to queue and print LWES events until\r\n the user types 'exit' followed by a carriage return."); listener.OnEventArrived += (sender, ev) => { Thread.MemoryBarrier(); mostRecent = ev; Thread.MemoryBarrier(); if (writeQ != null) writeQ.Enqueue(ev); Interlocked.Increment(ref incomingCount); }; ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { while (!userChoseToExit) { Thread.Sleep(2000); if (eventCount < Thread.VolatileRead(ref incomingCount)) { eventCount = Thread.VolatileRead(ref incomingCount); Thread.MemoryBarrier(); Event mr = mostRecent; Thread.MemoryBarrier(); Console.WriteLine(mr.ToString(true)); Console.WriteLine("Events received: {0}. Type 'exit' and hit the <return> key to exit.", eventCount.ToString("N0")); } } })); string input; do { input = Console.ReadLine(); } while (!String.Equals(input, "exit", StringComparison.CurrentCultureIgnoreCase)); userChoseToExit = true; } Thread.Sleep(200); Console.WriteLine("Final event count: {0}", incomingCount.ToString("N0")); Thread.Sleep(2000); }
public void RoundTripDotNetSerializationOfRandomlyGeneratedEvents() { // DotNet serializer will cause OutOfMemoryException if we try to serialize a million var t = new { EventsToGenerate = 10000, MaxNumberOfAttributes = 36, Encoding = SupportedEncoding.ISO_8859_1 }; int totalNumberOfAttributes = 0; // Serialization requires an IEventTemplateDB, we're gonna mock it here... var mock = new Mock<IEventTemplateDB>(); Event dummy; mock.Setup(db => db.TryCreateEvent(String.Empty, out dummy, false, SupportedEncoding.Default)) .Returns(false); SimpleLockFreeQueue<Event> serializationQueue = new SimpleLockFreeQueue<Event>(); SimpleLockFreeQueue<Event> comparisonQueue = new SimpleLockFreeQueue<Event>(); int serializationCount = 0; SimpleLockFreeQueue<byte[]> dataQueue = new SimpleLockFreeQueue<byte[]>(); SimpleLockFreeQueue<Event> deserializationQueue = new SimpleLockFreeQueue<Event>(); int deserializationCount = 0; long totalByteCount = 0; IFormatter serializer = new BinaryFormatter(); IFormatter deserializer = new BinaryFormatter(); Exception err = null; Stopwatch timer = Stopwatch.StartNew(); ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { for (int i = 0; i < t.EventsToGenerate && err == null; i++) { Event original = EventUtils.GenerateRandomEvent(String.Concat("MyEvent_", i), t.MaxNumberOfAttributes, t.Encoding); totalNumberOfAttributes += original.AttributeCount; serializationQueue.Enqueue(original); } } )); ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { Event original; try { while (serializationCount < t.EventsToGenerate && err == null) { if (serializationQueue.TryDequeue(out original)) { using (MemoryStream data = new MemoryStream(400)) { serializer.Serialize(data, original); dataQueue.Enqueue(data.GetBuffer()); totalByteCount += (data.Position + 1); } serializationCount++; } } } catch (Exception e) { err = e; } } )); byte[] buffer; try { while (deserializationCount < t.EventsToGenerate && err == null) { if (dataQueue.TryDequeue(out buffer)) { using (MemoryStream data = new MemoryStream(buffer)) { Event copy = (Event)deserializer.Deserialize(data); } deserializationCount++; } else Thread.Sleep(0); } } catch (Exception e) { err = e; } if (err != null) throw err; timer.Stop(); Console.Write(String.Concat("Generated ", t.EventsToGenerate, " events in ", timer.Elapsed , " which is ", (t.EventsToGenerate / timer.ElapsedMilliseconds), " per millisecond and " , (totalNumberOfAttributes / timer.ElapsedMilliseconds), " attributes per millisecond.", Environment.NewLine, (totalByteCount / timer.Elapsed.TotalSeconds).ToString("N00"), " bytes per second")); }