[PR #608] [MERGED] Some CPU improvements #1137

Open
opened 2026-01-29 14:50:15 +00:00 by claunia · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/xoofx/markdig/pull/608
Author: @MihaZupan
Created: 3/14/2022
Status: Merged
Merged: 3/19/2022
Merged by: @xoofx

Base: masterHead: perf-march-2022-2


📝 Commits (8)

  • 9f651fe Properly trim & cache FencedCodeBlock Info strings
  • 92385ee Set SkipLocalsInit for Markdig
  • fe65c1b Add & use ValueStringBuilder
  • 9ef5171 Reduce type check and casting overhead
  • e16ed79 Optimize StringLineGroup iteration
  • 58d7fae Cleanup exit condition in Unescape
  • 2675b4d Fixup FencedBlockParserBase nullability
  • 315ffd4 Move InternalsVisibleTo from targets to non-signed csproj

📊 Changes

32 files changed (+883 additions, -264 deletions)

View changed files

src/Markdig.Tests/TestFencedCodeBlocks.cs (+46 -0)
src/Markdig.Tests/TestTransformedStringCache.cs (+102 -0)
📝 src/Markdig/Extensions/AutoIdentifiers/AutoIdentifierExtension.cs (+12 -7)
📝 src/Markdig/Extensions/JiraLinks/JiraLinkInlineParser.cs (+10 -4)
📝 src/Markdig/Extensions/JiraLinks/JiraLinkOptions.cs (+6 -15)
📝 src/Markdig/Extensions/Tables/PipeTableParser.cs (+1 -1)
📝 src/Markdig/Helpers/EntityHelper.cs (+2 -3)
📝 src/Markdig/Helpers/HtmlHelper.cs (+29 -28)
📝 src/Markdig/Helpers/LinkHelper.cs (+63 -60)
📝 src/Markdig/Helpers/StringBuilderExtensions.cs (+0 -7)
📝 src/Markdig/Helpers/StringLineGroup.cs (+90 -55)
📝 src/Markdig/Helpers/StringSlice.cs (+20 -0)
src/Markdig/Helpers/TransformedStringCache.cs (+130 -0)
src/Markdig/Helpers/ValueStringBuilder.cs (+197 -0)
📝 src/Markdig/Markdig.csproj (+6 -1)
📝 src/Markdig/Parsers/BlockProcessor.cs (+51 -26)
📝 src/Markdig/Parsers/FencedBlockParserBase.cs (+32 -13)
📝 src/Markdig/Parsers/HtmlBlockParser.cs (+3 -3)
📝 src/Markdig/Parsers/IndentedCodeBlockParser.cs (+1 -1)
📝 src/Markdig/Parsers/InlineProcessor.cs (+8 -2)

...and 12 more files

📄 Description

  • Caching the FencedCodeBlock.InfoString & language-prefixed strings
  • Using ValueStringBuilder over StringBuilderCache.Local()
  • Avoiding the cost of type checks & casting for ContainerBlock, LeafBlock, ParagraphBlock and ContainerInline by setting flags on the base type instead (this is a ~5% CPU win by removing S.R.CompilerServices.CastHelpers.IsInstanceOfClass).
  • Improved StringLineGroup.NextChar - very hot method for LinkHelper

Parsing this document with PreciseSourceLocation:

Before

Method SourceText Mean Error StdDev Gen 0 Allocated
Parse TracingArticle 42.77 us 0.232 us 0.332 us 4.4556 18 KB

After

Method SourceText Mean Error StdDev Gen 0 Allocated
Parse TracingArticle 37.39 us 0.215 us 0.309 us 4.3945 18 KB

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/xoofx/markdig/pull/608 **Author:** [@MihaZupan](https://github.com/MihaZupan) **Created:** 3/14/2022 **Status:** ✅ Merged **Merged:** 3/19/2022 **Merged by:** [@xoofx](https://github.com/xoofx) **Base:** `master` ← **Head:** `perf-march-2022-2` --- ### 📝 Commits (8) - [`9f651fe`](https://github.com/xoofx/markdig/commit/9f651feac0f77b15ffa8d782edb0fecadacb24a5) Properly trim & cache FencedCodeBlock Info strings - [`92385ee`](https://github.com/xoofx/markdig/commit/92385ee19a13f4ad340b0d600ff42a89b045d10a) Set SkipLocalsInit for Markdig - [`fe65c1b`](https://github.com/xoofx/markdig/commit/fe65c1b187e87b861b43fbacbac897b4b1444863) Add & use ValueStringBuilder - [`9ef5171`](https://github.com/xoofx/markdig/commit/9ef5171369c71c079c23cbfb6ea2205c45467d1f) Reduce type check and casting overhead - [`e16ed79`](https://github.com/xoofx/markdig/commit/e16ed79dcd5a51ede98606bf0db4a13871559ee8) Optimize StringLineGroup iteration - [`58d7fae`](https://github.com/xoofx/markdig/commit/58d7fae12df31646ed1d35bd06144202189706d7) Cleanup exit condition in Unescape - [`2675b4d`](https://github.com/xoofx/markdig/commit/2675b4dd1e0d5142e2a15bc260340a16414b59b2) Fixup FencedBlockParserBase nullability - [`315ffd4`](https://github.com/xoofx/markdig/commit/315ffd42abe906d5da2d61387bd8b2446704039d) Move InternalsVisibleTo from targets to non-signed csproj ### 📊 Changes **32 files changed** (+883 additions, -264 deletions) <details> <summary>View changed files</summary> ➕ `src/Markdig.Tests/TestFencedCodeBlocks.cs` (+46 -0) ➕ `src/Markdig.Tests/TestTransformedStringCache.cs` (+102 -0) 📝 `src/Markdig/Extensions/AutoIdentifiers/AutoIdentifierExtension.cs` (+12 -7) 📝 `src/Markdig/Extensions/JiraLinks/JiraLinkInlineParser.cs` (+10 -4) 📝 `src/Markdig/Extensions/JiraLinks/JiraLinkOptions.cs` (+6 -15) 📝 `src/Markdig/Extensions/Tables/PipeTableParser.cs` (+1 -1) 📝 `src/Markdig/Helpers/EntityHelper.cs` (+2 -3) 📝 `src/Markdig/Helpers/HtmlHelper.cs` (+29 -28) 📝 `src/Markdig/Helpers/LinkHelper.cs` (+63 -60) 📝 `src/Markdig/Helpers/StringBuilderExtensions.cs` (+0 -7) 📝 `src/Markdig/Helpers/StringLineGroup.cs` (+90 -55) 📝 `src/Markdig/Helpers/StringSlice.cs` (+20 -0) ➕ `src/Markdig/Helpers/TransformedStringCache.cs` (+130 -0) ➕ `src/Markdig/Helpers/ValueStringBuilder.cs` (+197 -0) 📝 `src/Markdig/Markdig.csproj` (+6 -1) 📝 `src/Markdig/Parsers/BlockProcessor.cs` (+51 -26) 📝 `src/Markdig/Parsers/FencedBlockParserBase.cs` (+32 -13) 📝 `src/Markdig/Parsers/HtmlBlockParser.cs` (+3 -3) 📝 `src/Markdig/Parsers/IndentedCodeBlockParser.cs` (+1 -1) 📝 `src/Markdig/Parsers/InlineProcessor.cs` (+8 -2) _...and 12 more files_ </details> ### 📄 Description - Caching the `FencedCodeBlock.InfoString` & language-prefixed strings - Using `ValueStringBuilder` over `StringBuilderCache.Local()` - Avoiding the cost of type checks & casting for `ContainerBlock`, `LeafBlock`, `ParagraphBlock` and `ContainerInline` by setting flags on the base type instead (this is a ~5% CPU win by removing [`S.R.CompilerServices.CastHelpers.IsInstanceOfClass`](https://github.com/dotnet/runtime/blob/2f13361ba7d4cef84acae24751a3c367c1a6ab89/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/CastHelpers.cs#L277)). - Improved `StringLineGroup.NextChar` - very hot method for `LinkHelper` Parsing [this document](https://github.com/microsoft/reverse-proxy/blob/main/docs/docfx/articles/distributed-tracing.md) with `PreciseSourceLocation`: Before | Method | SourceText | Mean | Error | StdDev | Gen 0 | Allocated | |------- |--------------- |---------:|---------:|---------:|-------:|----------:| | Parse | TracingArticle | 42.77 us | 0.232 us | 0.332 us | 4.4556 | 18 KB | After | Method | SourceText | Mean | Error | StdDev | Gen 0 | Allocated | |------- |--------------- |---------:|---------:|---------:|-------:|----------:| | Parse | TracingArticle | 37.39 us | 0.215 us | 0.309 us | 4.3945 | 18 KB | --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
claunia added the pull-request label 2026-01-29 14:50:15 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/markdig#1137