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(); } }
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]); } }