Bump `MemoryPoolHttpResponseStreamWriter` buffer size up to 16K `char`s

- #3516
- fix tests that relied on otherwise-unused `HttpResponseStreamWriter.DefaultBufferSize`
This commit is contained in:
Doug Bunting 2016-11-25 15:54:52 -08:00
parent 68866f8716
commit 141b637d20
3 changed files with 29 additions and 8 deletions

View File

@ -15,9 +15,17 @@ namespace Microsoft.AspNetCore.Mvc.Internal
public class MemoryPoolHttpResponseStreamWriterFactory : IHttpResponseStreamWriterFactory
{
/// <summary>
/// The default size of created char buffers.
/// The default size of buffers <see cref="HttpResponseStreamWriter"/>s will allocate.
/// </summary>
public static readonly int DefaultBufferSize = 1024; // 1KB - results in a 4KB byte array for UTF8.
/// <value>
/// 16K causes each <see cref="HttpResponseStreamWriter"/> to allocate one 16K
/// <see langword="char"/> array and one 32K (for UTF8) <see langword="byte"/> array.
/// </value>
/// <remarks>
/// <see cref="MemoryPoolHttpResponseStreamWriterFactory"/> maintains <see cref="ArrayPool{T}"/>s
/// for these arrays.
/// </remarks>
public static readonly int DefaultBufferSize = 16 * 1024;
private readonly ArrayPool<byte> _bytePool;
private readonly ArrayPool<char> _charPool;

View File

@ -11,7 +11,6 @@ using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.TestCommon;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
@ -23,7 +22,8 @@ namespace Microsoft.AspNetCore.Mvc
{
public class ContentResultTest
{
private const int DefaultCharacterChunkSize = HttpResponseStreamWriter.DefaultBufferSize;
private static readonly int DefaultCharacterChunkSize =
MemoryPoolHttpResponseStreamWriterFactory.DefaultBufferSize;
[Fact]
public async Task ContentResult_Response_NullContent_SetsContentTypeAndEncoding()

View File

@ -9,6 +9,7 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TestCommon;
@ -297,10 +298,21 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
Assert.Equal(expectedLength, memoryStream.Length);
}
public static TheoryData<int> WriteLengthData
{
get
{
return new TheoryData<int>
{
MemoryPoolHttpResponseStreamWriterFactory.DefaultBufferSize - 1,
MemoryPoolHttpResponseStreamWriterFactory.DefaultBufferSize + 1,
2 * MemoryPoolHttpResponseStreamWriterFactory.DefaultBufferSize + 4,
};
}
}
[Theory]
[InlineData(HttpResponseStreamWriter.DefaultBufferSize - 1)]
[InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1)]
[InlineData(2 * HttpResponseStreamWriter.DefaultBufferSize + 4)]
[MemberData(nameof(WriteLengthData))]
public async Task ExecuteAsync_AsynchronouslyFlushesToTheResponseStream_PriorToDispose(int writeLength)
{
// Arrange
@ -310,7 +322,8 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
await v.Writer.WriteAsync(text);
});
var expectedWriteCallCount = Math.Ceiling((double)writeLength / HttpResponseStreamWriter.DefaultBufferSize);
var expectedWriteCallCount =
Math.Ceiling((double)writeLength / MemoryPoolHttpResponseStreamWriterFactory.DefaultBufferSize);
var context = new DefaultHttpContext();
var stream = new Mock<Stream>();