Skip to content

Commit e405b30

Browse files
committed
span
1 parent 50b1bda commit e405b30

File tree

1 file changed

+41
-8
lines changed

1 file changed

+41
-8
lines changed

src/Benchmarks/Middleware/MiddlewareHelpers.cs

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,26 @@ public static async Task RenderFortunesHtml(IEnumerable<Fortune> model, HttpCont
4040

4141
await httpContext.Response.StartAsync();
4242

43+
var writer = new BufferWriter<byte>(httpContext.Response.BodyWriter);
44+
4345
Encoding.UTF8.GetBytes(
4446
"<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>",
45-
httpContext.Response.BodyWriter);
47+
writer);
4648

4749
foreach (var item in model)
4850
{
49-
Encoding.UTF8.GetBytes("<tr><td>", httpContext.Response.BodyWriter);
50-
Encoding.UTF8.GetBytes(item.Id.ToString(CultureInfo.InvariantCulture), httpContext.Response.BodyWriter);
51-
Encoding.UTF8.GetBytes("</td><td>", httpContext.Response.BodyWriter);
52-
EncodeToPipe(httpContext.Response.BodyWriter, htmlEncoder, item.Message);
53-
Encoding.UTF8.GetBytes("</td></tr>", httpContext.Response.BodyWriter);
51+
Encoding.UTF8.GetBytes("<tr><td>", writer);
52+
Encoding.UTF8.GetBytes(item.Id.ToString(CultureInfo.InvariantCulture), writer);
53+
Encoding.UTF8.GetBytes("</td><td>", writer);
54+
EncodeToPipe(writer, htmlEncoder, item.Message);
55+
Encoding.UTF8.GetBytes("</td></tr>", writer);
5456
}
5557

56-
Encoding.UTF8.GetBytes("</table></body></html>", httpContext.Response.BodyWriter);
58+
Encoding.UTF8.GetBytes("</table></body></html>", writer);
5759

5860
await httpContext.Response.BodyWriter.FlushAsync();
5961

60-
static void EncodeToPipe(PipeWriter writer, HtmlEncoder htmlEncoder, string item)
62+
static void EncodeToPipe(IBufferWriter<byte> writer, HtmlEncoder htmlEncoder, string item)
6163
{
6264
Span<char> buffer = stackalloc char[256];
6365
int remaining = item.Length;
@@ -70,4 +72,35 @@ static void EncodeToPipe(PipeWriter writer, HtmlEncoder htmlEncoder, string item
7072
}
7173
}
7274
}
75+
76+
internal class BufferWriter<T> : IBufferWriter<T>
77+
{
78+
private readonly IBufferWriter<T> _inner;
79+
private Memory<T> _memory;
80+
81+
public BufferWriter(IBufferWriter<T> writer)
82+
{
83+
_inner = writer;
84+
}
85+
86+
public void Advance(int count)
87+
{
88+
_memory = _memory.Slice(count);
89+
_inner.Advance(count);
90+
}
91+
92+
public Memory<T> GetMemory(int sizeHint = 0)
93+
{
94+
if (_memory.Length == 0 || _memory.Length < sizeHint)
95+
{
96+
_memory = _inner.GetMemory(sizeHint);
97+
}
98+
return _memory;
99+
}
100+
101+
public Span<T> GetSpan(int sizeHint = 0)
102+
{
103+
return GetMemory(sizeHint).Span;
104+
}
105+
}
73106
}

0 commit comments

Comments
 (0)