Skip to content

Commit 5ad83e5

Browse files
committed
Stop UTF8 decoding/reencoding in Fortunes platform
1 parent 9074110 commit 5ad83e5

File tree

4 files changed

+13
-8
lines changed

4 files changed

+13
-8
lines changed

frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.Fortunes.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#if DATABASE
55

66
using System.Collections.Generic;
7+
using System.Diagnostics;
78
using System.IO.Pipelines;
89
using System.Text.Encodings.Web;
910
using System.Threading.Tasks;
@@ -43,7 +44,9 @@ private void OutputFortunes(PipeWriter pipeWriter, List<Fortune> model)
4344
writer.Write(_fortunesRowStart);
4445
writer.WriteNumeric((uint)item.Id);
4546
writer.Write(_fortunesColumn);
46-
writer.WriteUtf8String(HtmlEncoder.Encode(item.Message));
47+
HtmlEncoder.EncodeUtf8(item.Message.AsSpan(), writer.Span, out var bytesConsumed, out var bytesWritten, isFinalBlock: true);
48+
Debug.Assert(bytesConsumed == item.Message.Length, "Not enough remaining space in the buffer");
49+
writer.Advance(bytesWritten);
4750
writer.Write(_fortunesRowEnd);
4851
}
4952
writer.Write(_fortunesTableEnd);

frameworks/CSharp/aspnetcore/PlatformBenchmarks/BufferWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public void Advance(int count)
4444
}
4545

4646
[MethodImpl(MethodImplOptions.AggressiveInlining)]
47-
public void Write(ReadOnlySpan<byte> source)
47+
public void Write(scoped ReadOnlySpan<byte> source)
4848
{
4949
if (_span.Length >= source.Length)
5050
{
@@ -77,7 +77,7 @@ private void EnsureMore(int count = 0)
7777
_span = _output.GetSpan(count);
7878
}
7979

80-
private void WriteMultiBuffer(ReadOnlySpan<byte> source)
80+
private void WriteMultiBuffer(scoped ReadOnlySpan<byte> source)
8181
{
8282
while (source.Length > 0)
8383
{

frameworks/CSharp/aspnetcore/PlatformBenchmarks/Data/Fortune.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ namespace PlatformBenchmarks;
55

66
public readonly struct Fortune : IComparable<Fortune>, IComparable
77
{
8-
public Fortune(int id, string message)
8+
public Fortune(int id, byte[] message)
99
{
1010
Id = id;
1111
Message = message;
1212
}
1313

1414
public int Id { get; }
1515

16-
public string Message { get; }
16+
public byte[] Message { get; }
1717

1818
public int CompareTo(object obj) => throw new InvalidOperationException("The non-generic CompareTo should not be used");
1919

2020
// Performance critical, using culture insensitive comparison
21-
public int CompareTo(Fortune other) => string.CompareOrdinal(Message, other.Message);
21+
public int CompareTo(Fortune other) => Message.AsSpan().SequenceCompareTo(other.Message.AsSpan());
2222
}

frameworks/CSharp/aspnetcore/PlatformBenchmarks/Data/Providers/RawDbNpgsql.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,17 +209,19 @@ public async Task<List<Fortune>> LoadFortunesRows()
209209
result.Add(new Fortune
210210
(
211211
id:rdr.GetInt32(0),
212-
message: rdr.GetString(1)
212+
message: rdr.GetFieldValue<byte[]>(1)
213213
));
214214
}
215215
}
216216

217-
result.Add(new Fortune(id: 0, message: "Additional fortune added at request time." ));
217+
result.Add(new Fortune(id: 0, AdditionalFortune));
218218
result.Sort();
219219

220220
return result;
221221
}
222222

223+
private readonly byte[] AdditionalFortune = "Additional fortune added at request time."u8.ToArray();
224+
223225
private (NpgsqlCommand readCmd, NpgsqlParameter<int> idParameter) CreateReadCommand(NpgsqlConnection connection)
224226
{
225227
var cmd = new NpgsqlCommand("SELECT id, randomnumber FROM world WHERE id = $1", connection);

0 commit comments

Comments
 (0)