diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/RequestParsingBenchmark.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/RequestParsingBenchmark.cs index 08507ef3b8..3a35b3d808 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/RequestParsingBenchmark.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/RequestParsingBenchmark.cs @@ -67,6 +67,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance } } + [Benchmark(OperationsPerInvoke = RequestParsingData.InnerLoopCount * RequestParsingData.Pipelining)] + public void PipelinedPlaintextTechEmpowerDrainBuffer() + { + for (var i = 0; i < RequestParsingData.InnerLoopCount; i++) + { + InsertData(RequestParsingData.PlaintextTechEmpowerPipelinedRequests); + ParseDataDrainBuffer(); + } + } + [Benchmark(OperationsPerInvoke = RequestParsingData.InnerLoopCount)] public void LiveAspNet() { @@ -115,6 +125,41 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance buffer.FlushAsync().GetAwaiter().GetResult(); } + private void ParseDataDrainBuffer() + { + var awaitable = Pipe.Reader.ReadAsync(); + if (!awaitable.IsCompleted) + { + // No more data + return; + } + + var readableBuffer = awaitable.GetResult().Buffer; + do + { + Frame.Reset(); + + if (!Frame.TakeStartLine(readableBuffer, out var consumed, out var examined)) + { + ErrorUtilities.ThrowInvalidRequestLine(); + } + + readableBuffer = readableBuffer.Slice(consumed); + + Frame.InitializeHeaders(); + + if (!Frame.TakeMessageHeaders(readableBuffer, out consumed, out examined)) + { + ErrorUtilities.ThrowInvalidRequestHeaders(); + } + + readableBuffer = readableBuffer.Slice(consumed); + } + while (readableBuffer.Length > 0); + + Pipe.Reader.Advance(readableBuffer.End); + } + private void ParseData() { do