Exemplo n.º 1
0
        public void PerformanceTest()
        {
            var iterationCount = 3;
            var buffer         = new byte[1024 * 1024 * 1024];
            var gcHandle       = GCHandle.Alloc(buffer, GCHandleType.Pinned);

            try
            {
                var distinctMessages = new[]
                {
                    new string('a', 42),
                    new string('b', 256),
                    new string('c', 512),
                    new string('d', 1024 + 512),
                };

                var messages     = new List <string>();
                var messageCount = 0;
                var dataLength   = 0;
                while (dataLength < buffer.Length - 4096)
                {
                    var message = distinctMessages[messageCount % distinctMessages.Length];
                    messages.Add(message);
                    dataLength += message.Length + sizeof(int);
                }

                var length   = WriteLengthPrefixedMessages(buffer, messages.ToArray());
                var segments = CreateBuffers((byte *)gcHandle.AddrOfPinnedObject(), (RIO_BUF *)gcHandle.AddrOfPinnedObject(), length, 1024);

                Console.WriteLine($"{iterationCount} x {messages.Count:N0} messages");

                var releaser           = new TestReleaser();
                var framer             = new MessageFramer(releaser);
                var framedMessageCount = 0;

                GC.Collect();
                var sw = Stopwatch.StartNew();

                for (var iterations = 0; iterations < iterationCount; iterations++)
                {
                    foreach (var segment in segments)
                    {
                        List <BufferSegment> frame;
                        while (framer.TryFrameNextMessage(segment, out frame))
                        {
                            framedMessageCount++;
                        }
                    }
                }

                sw.Stop();
                var fps = framedMessageCount / sw.Elapsed.TotalSeconds;
                Console.WriteLine($"{framedMessageCount:N0} frames in {sw.Elapsed.TotalMilliseconds:N0} ms ({fps:N0} fps)");
            }
            finally
            {
                gcHandle.Free();
            }
        }
Exemplo n.º 2
0
        public void should_frame(string messageData, int bufferLength, string releasedBufferData)
        {
            // Arrange
            var releaser = new TestReleaser();
            var framer   = new MessageFramer(releaser);

            var expectedLastReleasedSegmentIds = releasedBufferData.Split('|').Select(x => x == "-" ? -1 : int.Parse(x)).ToArray();
            var expectedFramedMessages         = messageData.Split('|');
            var length   = WriteLengthPrefixedMessages(_underlyingBuffer, expectedFramedMessages);
            var segments = CreateBuffers((byte *)_bufferHandle.AddrOfPinnedObject(), (RIO_BUF *)_segmentbufferHandle.AddrOfPinnedObject(), length, bufferLength);

            var framedMessages         = new List <string>();
            var lastReleasedSegmentIds = new List <int>();

            // Act
            foreach (var segment in segments)
            {
                List <BufferSegment> frame;
                while (framer.TryFrameNextMessage(segment, out frame))
                {
                    var message = CreateMessage(frame);

                    framedMessages.Add(message);
                    lastReleasedSegmentIds.Add(releaser.LastReleasedSegmentId);
                }

                lastReleasedSegmentIds.Add(releaser.LastReleasedSegmentId);
            }

            // Assert
            Assert.AreEqual(expectedFramedMessages.Length, framedMessages.Count);
            for (var j = 0; j < expectedFramedMessages.Length; j++)
            {
                Assert.AreEqual(expectedFramedMessages[j], framedMessages[j]);
            }

            Assert.AreEqual(expectedLastReleasedSegmentIds.Length, lastReleasedSegmentIds.Count);
            for (var j = 0; j < expectedLastReleasedSegmentIds.Length; j++)
            {
                Assert.AreEqual(expectedLastReleasedSegmentIds[j], lastReleasedSegmentIds[j]);
            }
        }