コード例 #1
0
        public void DeliverySpeedMultithreadTest(int messageSize)
        {
            // Given

            const int threadCount = 5;
            var       stopwatch   = new Stopwatch();
            var       message     = CreateMessage(messageSize);

            var factory       = new RabbitMqMessageQueueFactory(RabbitMqSettings.Default, new Mock <ILog>().Object);
            var publisher     = factory.CreateMessageQueuePublisher();
            var listener      = factory.CreateMessageQueueListener();
            var subscriptions = factory.CreateMessageQueueManager();

            var publishEvent   = new ManualResetEvent(false);
            var startedEvent   = new CountdownEvent(threadCount);
            var completedEvent = new CountdownEvent(threadCount * IterationCount);
            var consumer       = new CountdownConsumer(completedEvent);

            subscriptions.CreateExchangeFanout(ExchangeName).Subscribe(QueueName, () => consumer);
            listener.StartListenAll();

            // When

            for (var t = 0; t < threadCount; ++t)
            {
                ThreadPool.QueueUserWorkItem(state =>
                {
                    startedEvent.Signal();
                    publishEvent.WaitOne();

                    for (var i = 0; i < IterationCount; ++i)
                    {
                        publisher.Publish(ExchangeName, null, null, message);
                    }
                });
            }

            startedEvent.Wait();

            stopwatch.Start();
            publishEvent.Set();
            completedEvent.Wait(WaitTimeout);
            stopwatch.Stop();

            listener.StopListenAll();

            // Then

            const int totalMessages = threadCount * IterationCount;
            var       totalSeconds  = stopwatch.Elapsed.TotalSeconds;

            Console.WriteLine(@"Message size: {0} Kb", messageSize / 1024);
            Console.WriteLine(@"Total time: {0:N4} sec", totalSeconds);
            Console.WriteLine(@"Publish time: {0:N4} ms/message", 1000 * totalSeconds / totalMessages);
            Console.WriteLine(@"Publish speed: {0:N4} message/sec", totalMessages / totalSeconds);
            Console.WriteLine(@"Publish bitrate: {0:N4} kbps", 8.0 * messageSize * totalMessages / (1024 * totalSeconds));
        }
コード例 #2
0
        public void PublishSpeedTest(int messageSize)
        {
            // Given

            var factory       = new RabbitMqMessageQueueFactory(RabbitMqSettings.Default, new Mock <ILog>().Object);
            var publisher     = factory.CreateMessageQueuePublisher();
            var listener      = factory.CreateMessageQueueListener();
            var subscriptions = factory.CreateMessageQueueManager();

            var completedEvent = new CountdownEvent(IterationCount);
            var consumer       = new CountdownConsumer(completedEvent);

            subscriptions.CreateExchangeFanout(ExchangeName).Subscribe(QueueName, () => consumer);

            // When

            var memoryBefore = GC.GetTotalMemory(true);

            listener.StartListenAll();

            for (var i = 0; i < IterationCount; ++i)
            {
                var message = CreateMessage(messageSize);
                publisher.Publish(ExchangeName, null, null, message);
            }

            listener.StopListenAll();

            GC.Collect();
            GC.WaitForPendingFinalizers();
            var memoryAfter = GC.GetTotalMemory(true);

            // Then

            var transferSize      = IterationCount * messageSize / 1024.0;
            var memoryLeak        = (memoryAfter - memoryBefore) / 1024.0;
            var memeryLeakPercent = 100 * memoryLeak / transferSize;

            Console.WriteLine(@"Message size: {0} Kb", messageSize / 1024);
            Console.WriteLine(@"Transfer messages: {0} messages ({1:N0} Kb)", IterationCount, transferSize);
            Console.WriteLine(@"Memory leak: {0:N0} Kb ({1:N0}%)", memoryLeak, memeryLeakPercent);

            Assert.LessOrEqual(memeryLeakPercent, 10);
        }