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")); }
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")); }