Add benchmark that drains the buffer without going through the pipe (#1611)

This commit is contained in:
David Fowler 2017-04-05 10:09:43 -07:00 committed by GitHub
parent adea477824
commit bab4332a47
1 changed files with 45 additions and 0 deletions

View File

@ -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