예제 #1
0
        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"));
        }
예제 #2
0
        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"));
        }