Skip to content

Commit 36f1f48

Browse files
committed
Update aspnetcore Platform to use latest Razor Slices
This allows enabling native AOT too
1 parent ce782ff commit 36f1f48

File tree

6 files changed

+39
-35
lines changed

6 files changed

+39
-35
lines changed

frameworks/CSharp/aspnetcore/benchmark_config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"json_url": "/json",
3131
"db_url": "/db",
3232
"query_url": "/queries/",
33+
"fortune_url": "/fortunes",
3334
"update_url": "/updates/",
3435
"cached_query_url": "/cached-worlds/",
3536
"port": 8080,

frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4-
#if !AOT
4+
using System;
55
using System.IO.Pipelines;
66
using System.Runtime.CompilerServices;
77
using System.Threading.Tasks;
@@ -19,7 +19,7 @@ await RawDb.LoadFortunesRows(),
1919
FortunesTemplateFactory);
2020
}
2121

22-
private ValueTask OutputFortunes<TModel>(PipeWriter pipeWriter, TModel model, SliceFactory<TModel> templateFactory)
22+
private ValueTask OutputFortunes<TModel>(PipeWriter pipeWriter, TModel model, Func<TModel, RazorSlice<TModel>> templateFactory)
2323
{
2424
// Render headers
2525
var preamble = """
@@ -39,7 +39,7 @@ private ValueTask OutputFortunes<TModel>(PipeWriter pipeWriter, TModel model, Sl
3939
// Kestrel PipeWriter span size is 4K, headers above already written to first span & template output is ~1350 bytes,
4040
// so 2K chunk size should result in only a single span and chunk being used.
4141
var chunkedWriter = GetChunkedWriter(pipeWriter, chunkSizeHint: 2048);
42-
var renderTask = template.RenderAsync(chunkedWriter, null, HtmlEncoder);
42+
var renderTask = template.RenderAsync(chunkedWriter, HtmlEncoder);
4343

4444
if (renderTask.IsCompletedSuccessfully)
4545
{
@@ -51,18 +51,17 @@ private ValueTask OutputFortunes<TModel>(PipeWriter pipeWriter, TModel model, Sl
5151
return AwaitTemplateRenderTask(renderTask, chunkedWriter, template);
5252
}
5353

54-
private static async ValueTask AwaitTemplateRenderTask(ValueTask renderTask, ChunkedBufferWriter<WriterAdapter> chunkedWriter, RazorSlice template)
54+
private static async ValueTask AwaitTemplateRenderTask(ValueTask renderTask, ChunkedPipeWriter chunkedWriter, RazorSlice template)
5555
{
5656
await renderTask;
5757
EndTemplateRendering(chunkedWriter, template);
5858
}
5959

6060
[MethodImpl(MethodImplOptions.AggressiveInlining)]
61-
private static void EndTemplateRendering(ChunkedBufferWriter<WriterAdapter> chunkedWriter, RazorSlice template)
61+
private static void EndTemplateRendering(ChunkedPipeWriter chunkedWriter, RazorSlice template)
6262
{
63-
chunkedWriter.End();
63+
chunkedWriter.Complete();
6464
ReturnChunkedWriter(chunkedWriter);
6565
template.Dispose();
6666
}
6767
}
68-
#endif

frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.HttpConnection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,15 @@ private static BufferWriter<WriterAdapter> GetWriter(PipeWriter pipeWriter, int
193193
=> new(new(pipeWriter), sizeHint);
194194

195195
[MethodImpl(MethodImplOptions.AggressiveInlining)]
196-
private static ChunkedBufferWriter<WriterAdapter> GetChunkedWriter(PipeWriter pipeWriter, int chunkSizeHint)
196+
private static ChunkedPipeWriter GetChunkedWriter(PipeWriter pipeWriter, int chunkSizeHint)
197197
{
198198
var writer = ChunkedWriterPool.Get();
199-
writer.SetOutput(new WriterAdapter(pipeWriter), chunkSizeHint);
199+
writer.SetOutput(pipeWriter, chunkSizeHint);
200200
return writer;
201201
}
202202

203203
[MethodImpl(MethodImplOptions.AggressiveInlining)]
204-
private static void ReturnChunkedWriter(ChunkedBufferWriter<WriterAdapter> writer) => ChunkedWriterPool.Return(writer);
204+
private static void ReturnChunkedWriter(ChunkedPipeWriter writer) => ChunkedWriterPool.Return(writer);
205205

206206
private struct WriterAdapter : IBufferWriter<byte>
207207
{

frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
using System.Threading.Tasks;
1111
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
1212
using Microsoft.Extensions.ObjectPool;
13-
#if !AOT
13+
using Platform.Templates;
1414
using RazorSlices;
15-
#endif
1615

1716
namespace PlatformBenchmarks
1817
{
@@ -42,26 +41,24 @@ public sealed partial class BenchmarkApplication
4241

4342
public static RawDb RawDb { get; set; }
4443

45-
private static readonly DefaultObjectPool<ChunkedBufferWriter<WriterAdapter>> ChunkedWriterPool
44+
private static readonly DefaultObjectPool<ChunkedPipeWriter> ChunkedWriterPool
4645
= new(new ChunkedWriterObjectPolicy());
4746

48-
private sealed class ChunkedWriterObjectPolicy : IPooledObjectPolicy<ChunkedBufferWriter<WriterAdapter>>
47+
private sealed class ChunkedWriterObjectPolicy : IPooledObjectPolicy<ChunkedPipeWriter>
4948
{
50-
public ChunkedBufferWriter<WriterAdapter> Create() => new();
49+
public ChunkedPipeWriter Create() => new();
5150

52-
public bool Return(ChunkedBufferWriter<WriterAdapter> writer)
51+
public bool Return(ChunkedPipeWriter writer)
5352
{
5453
writer.Reset();
5554
return true;
5655
}
5756
}
5857

59-
#if !AOT
6058
#if NPGSQL
61-
private readonly static SliceFactory<List<FortuneUtf8>> FortunesTemplateFactory = RazorSlice.ResolveSliceFactory<List<FortuneUtf8>>("/Templates/FortunesUtf8.cshtml");
59+
private readonly static Func<List<FortuneUtf8>, RazorSlice<List<FortuneUtf8>>> FortunesTemplateFactory = FortunesUtf8.Create;
6260
#else
63-
private readonly static SliceFactory<List<FortuneUtf16>> FortunesTemplateFactory = RazorSlice.ResolveSliceFactory<List<FortuneUtf16>>("/Templates/FortunesUtf16.cshtml");
64-
#endif
61+
private readonly static Func<List<FortuneUtf16>, RazorSlice<List<FortuneUtf16>>> FortunesTemplateFactory = FortunesUtf16.Create;
6562
#endif
6663

6764
[ThreadStatic]
@@ -167,9 +164,7 @@ private bool ProcessRequest(ref BufferWriter<WriterAdapter> writer)
167164

168165
private Task ProcessRequestAsync() => _requestType switch
169166
{
170-
#if !AOT
171167
RequestType.FortunesRaw => FortunesRaw(Writer),
172-
#endif
173168
RequestType.SingleQuery => SingleQuery(Writer),
174169
RequestType.Caching => Caching(Writer, _queries),
175170
RequestType.Updates => Updates(Writer, _queries),

frameworks/CSharp/aspnetcore/src/Platform/ChunkedBufferWriter.cs renamed to frameworks/CSharp/aspnetcore/src/Platform/ChunkedPipeWriter.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@
55
using System.Buffers;
66
using System.Buffers.Text;
77
using System.Diagnostics;
8+
using System.IO.Pipelines;
89
using System.Numerics;
910
using System.Runtime.CompilerServices;
11+
using System.Threading;
12+
using System.Threading.Tasks;
1013

1114
namespace PlatformBenchmarks;
1215

13-
internal sealed class ChunkedBufferWriter<TWriter> : IBufferWriter<byte> where TWriter : IBufferWriter<byte>
16+
internal sealed class ChunkedPipeWriter : PipeWriter
1417
{
1518
private const int DefaultChunkSizeHint = 2048;
1619
private static readonly StandardFormat DefaultHexFormat = GetHexFormat(DefaultChunkSizeHint);
1720
private static ReadOnlySpan<byte> ChunkTerminator => "\r\n"u8;
1821

19-
private TWriter _output;
22+
private PipeWriter _output;
2023
private int _chunkSizeHint;
2124
private StandardFormat _hexFormat = DefaultHexFormat;
2225
private Memory<byte> _currentFullChunk;
@@ -26,12 +29,12 @@ internal sealed class ChunkedBufferWriter<TWriter> : IBufferWriter<byte> where T
2629

2730
public Memory<byte> Memory => _currentChunk;
2831

29-
public TWriter Output => _output;
32+
public PipeWriter Output => _output;
3033

3134
public int Buffered => _buffered;
3235

3336
[MethodImpl(MethodImplOptions.AggressiveInlining)]
34-
public void SetOutput(TWriter output, int chunkSizeHint = DefaultChunkSizeHint)
37+
public void SetOutput(PipeWriter output, int chunkSizeHint = DefaultChunkSizeHint)
3538
{
3639
_buffered = 0;
3740
_chunkSizeHint = chunkSizeHint;
@@ -52,15 +55,15 @@ public void Reset()
5255
}
5356

5457
[MethodImpl(MethodImplOptions.AggressiveInlining)]
55-
public void Advance(int count)
58+
public override void Advance(int count)
5659
{
5760
ThrowIfEnded();
5861

5962
_buffered += count;
6063
_currentChunk = _currentChunk[count..];
6164
}
6265

63-
public Memory<byte> GetMemory(int sizeHint = 0)
66+
public override Memory<byte> GetMemory(int sizeHint = 0)
6467
{
6568
ThrowIfEnded();
6669

@@ -71,9 +74,14 @@ public Memory<byte> GetMemory(int sizeHint = 0)
7174
return _currentChunk;
7275
}
7376

74-
public Span<byte> GetSpan(int sizeHint = 0) => GetMemory(sizeHint).Span;
77+
public override Span<byte> GetSpan(int sizeHint = 0) => GetMemory(sizeHint).Span;
7578

76-
public void End()
79+
public override void CancelPendingFlush()
80+
{
81+
_output.CancelPendingFlush();
82+
}
83+
84+
public override void Complete(Exception exception = null)
7785
{
7886
ThrowIfEnded();
7987

@@ -82,6 +90,11 @@ public void End()
8290
_ended = true;
8391
}
8492

93+
public override ValueTask<FlushResult> FlushAsync(CancellationToken cancellationToken = default)
94+
{
95+
return _output.FlushAsync(cancellationToken);
96+
}
97+
8598
[MethodImpl(MethodImplOptions.AggressiveInlining)]
8699
private static StandardFormat GetHexFormat(int maxValue)
87100
{

frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
<IsTestAssetProject>true</IsTestAssetProject>
77
<LangVersion>preview</LangVersion>
88
<UserSecretsId>38063504-d08c-495a-89c9-daaad2f60f31</UserSecretsId>
9-
<DefineConstants Condition="'$(PublishAot)' == 'true'">AOT;$(DefineConstants)</DefineConstants>
109
</PropertyGroup>
1110

1211
<PropertyGroup>
@@ -22,12 +21,9 @@
2221
<PackageReference Include="Npgsql" Version="8.0.5" />
2322
<PackageReference Include="MySqlConnector" Version="2.3.7" />
2423
<PackageReference Include="Dapper" Version="2.1.35" />
25-
<PackageReference Include="RazorSlices" Version="0.7.0" Condition="$(PublishAot) != 'true'" />
24+
<PackageReference Include="RazorSlices" Version="0.8.1" />
2625
</ItemGroup>
2726

28-
<PropertyGroup Condition="$(PublishAot) == 'true'">
29-
<DefaultItemExcludes>$(MSBuildThisFileDirectory)Templates/**;$(DefaultItemExcludes)</DefaultItemExcludes>
30-
</PropertyGroup>
3127
<ItemGroup Condition="$(PublishAot) == 'true'">
3228
<RuntimeHostConfigurationOption Include="System.Threading.ThreadPool.HillClimbing.Disable" Value="true" />
3329
</ItemGroup>

0 commit comments

Comments
 (0)