From 55fea7976c87a224340f4012316c991be7d53e02 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 26 Feb 2019 16:25:10 -0800 Subject: [PATCH 1/5] Improve NullHtmlEncoder perf --- .../Razor/src/TagHelpers/NullHtmlEncoder.cs | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs index 9c7c6c3284..fc2b6b1cfd 100644 --- a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs +++ b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Runtime.CompilerServices; using System.Text.Encodings.Web; namespace Microsoft.AspNetCore.Razor.TagHelpers @@ -11,12 +12,12 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers /// A that does not encode. Should not be used when writing directly to a response /// expected to contain valid HTML. /// - public class NullHtmlEncoder : HtmlEncoder + public sealed class NullHtmlEncoder : HtmlEncoder { /// /// Initializes a instance. /// - protected NullHtmlEncoder() + private NullHtmlEncoder() { } @@ -27,13 +28,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers public static new NullHtmlEncoder Default { get; } = new NullHtmlEncoder(); /// - public override int MaxOutputCharactersPerInputCharacter - { - get - { - return 1; - } - } + public override int MaxOutputCharactersPerInputCharacter => 1; /// public override string Encode(string value) @@ -68,27 +63,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers } /// - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write(value.Substring(startIndex, characterCount)); - } - - /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) { return -1; @@ -112,6 +87,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers } /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool WillEncode(int unicodeScalar) { return false; From ba875bffcd3f8ca80d5ffe426113b54d32c996a2 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 26 Feb 2019 17:11:24 -0800 Subject: [PATCH 2/5] Using spans to optimize the slicing case --- src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs index fc2b6b1cfd..e7150a786b 100644 --- a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs +++ b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs @@ -62,6 +62,12 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers output.Write(value, startIndex, characterCount); } + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + var span = value.AsSpan(); + output.Write(span.Slice(startIndex, characterCount)); + } + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) From 23dee7c43f46b5cb8c3f1145461a93c4ca339d77 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 26 Feb 2019 17:15:23 -0800 Subject: [PATCH 3/5] Keep argument checks --- src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs index e7150a786b..be4b2d17c2 100644 --- a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs +++ b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs @@ -64,6 +64,21 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + var span = value.AsSpan(); output.Write(span.Slice(startIndex, characterCount)); } From 1c2c2c9be0a428562ad20989c965f4b2e407155f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Thu, 28 Feb 2019 10:35:57 -0800 Subject: [PATCH 4/5] Update NullHtmlEncoder.cs --- src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs index be4b2d17c2..f1d0410e8b 100644 --- a/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs +++ b/src/Razor/Razor/src/TagHelpers/NullHtmlEncoder.cs @@ -79,8 +79,9 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers return; } - var span = value.AsSpan(); - output.Write(span.Slice(startIndex, characterCount)); + var span = value.AsSpan(startIndex, characterCount); + + output.Write(span); } /// From 275960631db32e2293e0b0a31216b396c8f3ec6f Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 28 Feb 2019 15:58:54 -0800 Subject: [PATCH 5/5] Updating ref file --- .../Razor/ref/Microsoft.AspNetCore.Razor.netcoreapp3.0.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Razor/Razor/ref/Microsoft.AspNetCore.Razor.netcoreapp3.0.cs b/src/Razor/Razor/ref/Microsoft.AspNetCore.Razor.netcoreapp3.0.cs index ead42a89cd..032cc69911 100644 --- a/src/Razor/Razor/ref/Microsoft.AspNetCore.Razor.netcoreapp3.0.cs +++ b/src/Razor/Razor/ref/Microsoft.AspNetCore.Razor.netcoreapp3.0.cs @@ -61,17 +61,17 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers void Init(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context); System.Threading.Tasks.Task ProcessAsync(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context, Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output); } - public partial class NullHtmlEncoder : System.Text.Encodings.Web.HtmlEncoder + public sealed partial class NullHtmlEncoder : System.Text.Encodings.Web.HtmlEncoder { - protected NullHtmlEncoder() { } + internal NullHtmlEncoder() { } public static new Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder Default { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public override int MaxOutputCharactersPerInputCharacter { get { throw null; } } public override void Encode(System.IO.TextWriter output, char[] value, int startIndex, int characterCount) { } public override void Encode(System.IO.TextWriter output, string value, int startIndex, int characterCount) { } public override string Encode(string value) { throw null; } - public unsafe override int FindFirstCharacterToEncode(char* text, int textLength) { throw null; } + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]public unsafe override int FindFirstCharacterToEncode(char* text, int textLength) { throw null; } public unsafe override bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) { throw null; } - public override bool WillEncode(int unicodeScalar) { throw null; } + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]public override bool WillEncode(int unicodeScalar) { throw null; } } [System.AttributeUsageAttribute(System.AttributeTargets.Class, AllowMultiple=false, Inherited=false)] public sealed partial class OutputElementHintAttribute : System.Attribute