From 39dd32992d07914892accf7895dde64ae9f8f296 Mon Sep 17 00:00:00 2001 From: Youmu Liu <105042599+Nitload-NSI@users.noreply.github.com> Date: Wed, 11 Feb 2026 18:02:45 +0800 Subject: [PATCH] Working on tree optimizer --- .../0731D21DF68A684A61100DCBE1181044.png | Bin 0 -> 104032 bytes .../Memory/InroductionToHLSF.md | 40 +------ .../Abstraction/AbstractSyntaxTree.cs | 15 ++- .../Abstraction/CompileStack.cs | 2 + .../Abstraction/ISyntaxNode.cs | 8 -- .../TextRegex/RegexAstNode.cs | 45 +++++-- .../TextRegex/RegexInterpreter.Optimize.cs | 113 +++++++++++++++++- .../TextRegex/RegexInterpreter.cs | 31 +++-- .../TextRegex/RegexTokenReader.cs | 2 +- 9 files changed, 193 insertions(+), 63 deletions(-) create mode 100644 .cr/images/0731D21DF68A684A61100DCBE1181044.png diff --git a/.cr/images/0731D21DF68A684A61100DCBE1181044.png b/.cr/images/0731D21DF68A684A61100DCBE1181044.png new file mode 100644 index 0000000000000000000000000000000000000000..38f6e8034c56553562705b9571980d11b0b4f77b GIT binary patch literal 104032 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 I*YWy40RB;&lmGw# literal 0 HcmV?d00001 diff --git a/StgSharp.Common/HighPerformance/Memory/InroductionToHLSF.md b/StgSharp.Common/HighPerformance/Memory/InroductionToHLSF.md index e8a09593..3a23d32f 100644 --- a/StgSharp.Common/HighPerformance/Memory/InroductionToHLSF.md +++ b/StgSharp.Common/HighPerformance/Memory/InroductionToHLSF.md @@ -6,7 +6,7 @@ A constant-time (O(1)) allocator for real-time, high-throughput scenarios. It us - O(1) allocate/free with 10 levels: 64B x 16MB; each level split into 1x/2x/3x segments - External metadata (`Entry`, `BucketNode`) in dedicated SLABs; user blocks have no headers -- Configurable alignment (>=16B); large block cap per allocation: 32MB +- Configurable alignment (>=16B); maximum block size is configurable at construction time via the `maxBlockSize` parameter (default 32MB, 10 levels). The level array and bucket table are dynamically extended when a larger `maxBlockSize` is specified. There is no implicit fallback to `NativeMemory` for oversized requests. - Single-threaded implementation (external sync required for multi-threaded use) ## Quick Use @@ -23,13 +23,13 @@ hlsf.Free(h); ### Alloc(uint size) - Purpose: Allocate a block of at least `size` bytes. -- Input: `size` in bytes (<= 32MB for internal path; >32MB uses native large allocation). +- Input: `size` in bytes. Must not exceed the `maxBlockSize` configured at construction time (default 32MB). If `size > _maxSize`, an `InvalidOperationException` is thrown. - Output: `HybridLayerSegregatedFitAllocationHandle` with pointer access and `Span`. - Behavior: - Classify into level/segment and pop a matching bucket; escalate segments and levels if empty. - Fallback to overflow bucket or carve 32MB from spare memory if all buckets are empty. - Mark selected `Entry` as Alloc; slice any remainder into `Empty` entries and push to buckets. - - For >32MB requests, use `NativeMemory.AlignedAlloc` and mark `EntryState.Large`. + - There is no implicit fallback to `NativeMemory.AlignedAlloc` for oversized requests — all allocations are served from the pre-allocated arena. The level array and bucket table are dynamically sized based on the `maxBlockSize` parameter. ### Free(HybridLayerSegregatedFitAllocationHandle handle) @@ -47,34 +47,6 @@ hlsf.Free(h); - Consolidate fragmented regions where possible and improve bucket coverage. - Intended to be cheap; safe to call between benchmark phases. -## Benchmarks (this run) - -Environment: .NET 8 (Release), x64, single-thread, arena=3072 MiB. Results from StgSharpDebug/HlsfStressTest. - -- Free throughput: 1KB x 262,144 -> 38,928,422.9 free/s -- Alloc+free pairs: 256B x 5,000,000 -> 25,006,976.9 ops/s -- Fragmentation cycle (~512MB): fast recovery in short cycle (see test for details) - -Representative allocation throughput (higher is better): - -| Size | Ops | alloc/s (no touch) | alloc/s (touch) | -|------|----:|--------------------:|----------------:| -| 64B | 2,000,000 | 8,780,467.7 | 17,524,920.4 | -| 1KB | 1,572,864 | 8,974,865.4 | 9,585,531.6 | -| 4KB | 393,216 | 7,340,392.2 | 6,849,319.4 | -| 32KB | 49,152 | 10,376,625.6 | 7,019,407.9 | -| 256KB | 6,144 | 16,041,775.5 | 12,842,809.4 | -| 512KB | 3,072 | 20,466,355.8 | 14,195,933.5 | -| 1MB | 1,536 | 16,916,299.6 | 13,568,904.6 | -| 2MB | 768 | 17,985,948.5 | 12,569,558.1 | -| 8MB | 192 | 13,426,573.4 | 11,034,482.8 | -| 32MB | 48 | 11,162,790.7 | 9,411,764.7 | - -Notes: - -- Peak no-touch at 2MB (~17.99M alloc/s). Peak touch near 64B (~17.52M alloc/s). -- Non-aligned sizes (e.g., 768B, 3KB) typically lower due to slicing/boundary handling. - ### BenchmarkDotNet (HLSF vs Libc) Environment: .NET 8.0.23 (Release), x64 RyuJIT AVX2, Windows 11, AMD Ryzen 7 6800H. @@ -90,7 +62,7 @@ Interpretation: HLSF matches libc allocation throughput under the same workload, ## Detailed Design (summary) - -- Size classes: levelSizeArray = [64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216] (64B x 4^level) +- Size classes: The default level size array is [64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216] (10 levels, 64B × 4^level). When `maxBlockSize` is specified at construction and exceeds the default range, additional levels are appended (each 4× the previous) to cover the requested maximum block size. - Segments per level: 1x, 2x, 3x - Buckets: index = 3 * level + segment (overflow bucket for level > 9) - Metadata: Entry (external SLAB, position chain), BucketNode (user region, bucket chain) @@ -143,8 +115,8 @@ Interpretation: HLSF matches libc allocation throughput under the same workload, ### Large Allocations and Spare Memory -- Requests > 32MB use `NativeMemory.AlignedAlloc(size, align)` and mark `State.Large` -- When buckets are empty, `TryAllocateNew32MBBlock` carves a 32MB region from `_spareMemory`, builds an `Empty` entry, and advances the spare pointer +- Requests exceeding the configured `maxBlockSize` are rejected with `InvalidOperationException`. All allocations are served from the pre-allocated arena. +- When all buckets are empty, `TryAllocateNew32MBBlock` carves a region (up to 32MB) from `_spareMemory` to replenish the bucket system, builds an `Empty` entry, and advances the spare pointer ### Alignment diff --git a/StgSharp.RegularAnalysis/Abstraction/AbstractSyntaxTree.cs b/StgSharp.RegularAnalysis/Abstraction/AbstractSyntaxTree.cs index 765907f8..cde45b0f 100644 --- a/StgSharp.RegularAnalysis/Abstraction/AbstractSyntaxTree.cs +++ b/StgSharp.RegularAnalysis/Abstraction/AbstractSyntaxTree.cs @@ -181,9 +181,20 @@ namespace StgSharp.RegularAnalysis.Abstraction _state = 0; } - public void SkipNode() + /// + /// Skips the node and its subtree if the current node is the given node. Otherwise, do + /// nothing. + /// + /// + /// The node to skip. + /// + public void SkipNode( + TNode node + ) { - if (_stack.TryPop(out Record? r)) { + if (_stack.TryPeek(out Record? r) && ReferenceEquals(r.Node, node)) + { + _ = _stack.Pop(); _recycle.Push(r); } } diff --git a/StgSharp.RegularAnalysis/Abstraction/CompileStack.cs b/StgSharp.RegularAnalysis/Abstraction/CompileStack.cs index 285b8d78..a33cf88b 100644 --- a/StgSharp.RegularAnalysis/Abstraction/CompileStack.cs +++ b/StgSharp.RegularAnalysis/Abstraction/CompileStack.cs @@ -176,6 +176,7 @@ namespace StgSharp.RegularAnalysis.Abstraction #region depth + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void DecreaseDepth( ) { @@ -185,6 +186,7 @@ namespace StgSharp.RegularAnalysis.Abstraction } } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void IncreaseDepth( int mark ) diff --git a/StgSharp.RegularAnalysis/Abstraction/ISyntaxNode.cs b/StgSharp.RegularAnalysis/Abstraction/ISyntaxNode.cs index 0d816001..3911e7b4 100644 --- a/StgSharp.RegularAnalysis/Abstraction/ISyntaxNode.cs +++ b/StgSharp.RegularAnalysis/Abstraction/ISyntaxNode.cs @@ -66,14 +66,6 @@ namespace StgSharp.RegularAnalysis.Abstraction TNode nextToken ); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static virtual bool IsNullOrEmpty( - TNode node - ) - { - return node is null || node.Equals(TNode.Empty); - } - void PrependNode( TNode previousNode ); diff --git a/StgSharp.RegularAnalysis/TextRegex/RegexAstNode.cs b/StgSharp.RegularAnalysis/TextRegex/RegexAstNode.cs index 9e6913f4..db926891 100644 --- a/StgSharp.RegularAnalysis/TextRegex/RegexAstNode.cs +++ b/StgSharp.RegularAnalysis/TextRegex/RegexAstNode.cs @@ -33,6 +33,7 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; namespace StgSharp.RegularAnalysis.TextRegex { @@ -52,10 +53,8 @@ namespace StgSharp.RegularAnalysis.TextRegex public long NodeFlag => (long)Source.Flag; - public static RegexAstNode Empty - { - get => new EmptyRegexAstNode(); - } + public static RegexAstNode Empty { get; } + = new EmptyRegexAstNode(); public RegexAstNode Previous { get; set; } @@ -68,7 +67,7 @@ namespace StgSharp.RegularAnalysis.TextRegex get; set { - field?.Parent = null; + field?.Parent = Empty; field = value; value.Parent = this; } @@ -79,7 +78,7 @@ namespace StgSharp.RegularAnalysis.TextRegex get; set { - field?.Parent = null; + field?.Parent = Empty; field = value; value.Parent = this; } @@ -90,13 +89,19 @@ namespace StgSharp.RegularAnalysis.TextRegex get => Source.Flag; } + public string Value => Source.Value; + public string CodeConvertTemplate { get; } public Token Source { get; } public void AppendNode( RegexAstNode nextToken - ) { } + ) + { + Next = nextToken; + nextToken.Previous = this; + } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (bool Valid,int Value) ComparePrecedence( @@ -113,9 +118,33 @@ namespace StgSharp.RegularAnalysis.TextRegex return (true,v_left - v_right); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsNullOrEmpty( + RegexAstNode node + ) + { + return node is null || node.Equals(Empty); + } + public void PrependNode( RegexAstNode previousNode - ) { } + ) + { + Previous = previousNode; + previousNode.Next = this; + } + + public void RemoveChild( + RegexAstNode node + ) + { + if (Left == node) + { + Left = Empty; + } else if (Right == node) { + Right = Empty; + } + } public static bool TryMergeUnit( RegexAstNode prev, diff --git a/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.Optimize.cs b/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.Optimize.cs index 38f7211a..dc98ee78 100644 --- a/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.Optimize.cs +++ b/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.Optimize.cs @@ -28,7 +28,9 @@ using StgSharp.RegularAnalysis.Abstraction; using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; @@ -43,9 +45,118 @@ namespace StgSharp.RegularAnalysis.TextRegex { TreeEnumerator enumerator = new(root); List cases = []; + RegexAstNode current; + _ = enumerator.MoveNext(); // skip root while (enumerator.MoveNext()) { - RegexAstNode current = enumerator.Current; + current = enumerator.Current; + current.Parent.RemoveChild(current); + current.Parent = RegexAstNode.Empty; + if (current.Parent.EqualityTypeConvert == RegexElementLabel.ALT) + { + continue; + } else + { + cases.Add(current); + enumerator.SkipNode(current); + } + } + for (int i = 0; i < cases.Count - 1; i++) + { + cases[i].AppendNode(cases[i + 1]); + cases[i].Parent = root; + } + return cases[0]; + } + + private static void MergeConcat( + RegexAstNode root + ) + { + if (root.EqualityTypeConvert != RegexElementLabel.CONCAT) { + return; + } + List buffer = []; + int length = 0; + RegexAstNode right = root.Right; + RegexAstNode left = root.Left; + if (left.EqualityTypeConvert != RegexElementLabel.UNIT_SPAN && + left.EqualityTypeConvert != RegexElementLabel.UNIT) { + return; + } + string str = left.Value; + buffer.Add(str); + length += str.Length; + while (RegexAstNode.IsNullOrEmpty(right) && + right.EqualityTypeConvert == RegexElementLabel.CONCAT) + { + left = right.Left; + if (left.EqualityTypeConvert != RegexElementLabel.UNIT_SPAN && + left.EqualityTypeConvert != RegexElementLabel.UNIT) + { + break; + } + str = left.Value; + buffer.Add(str); + length += str.Length; + root.Right = right.Right; + + // TODO: remove right from tree + right = root.Right; + } + str = string.Create(length, buffer, static( + span, + buffer + ) => { + int offset = 0; + for (int i = 0; i < buffer.Count; i++) + { + buffer[i].AsSpan().CopyTo(span[offset..]); + offset += buffer[i].Length; + } + }); + left = root.Left; + root.Left = new RegexAstNode(new Token(str, left.Source.Line, + left.Source.Column, + str.Length == 1 ? + RegexElementLabel.UNIT : + RegexElementLabel.UNIT_SPAN)); + } + + private static void RotateConcat( + RegexAstNode root + ) + { + RegexAstNode left = root.Left; + while (RegexAstNode.IsNullOrEmpty(left) && + left.EqualityTypeConvert == RegexElementLabel.CONCAT) + { + /* + * root → root + * ╱ ╲ ╱ ╲ + * left c a left + * ╱ ╲ ╱ ╲ + * a b b c + */ + RegexAstNode a = left.Left; + RegexAstNode b = left.Right; + RegexAstNode c = root.Right; + root.Left = a; + if (RegexAstNode.IsNullOrEmpty(a)) { + a.Parent = root; + } + + root.Right = left; + left.Left = b; + left.Right = c; + if (RegexAstNode.IsNullOrEmpty(b)) { + b.Parent = left; + } + + if (RegexAstNode.IsNullOrEmpty(c)) { + c.Parent = left; + } + left = root.Left; } } diff --git a/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.cs b/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.cs index ca8e038e..15ad6e3b 100644 --- a/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.cs +++ b/StgSharp.RegularAnalysis/TextRegex/RegexInterpreter.cs @@ -174,24 +174,37 @@ namespace StgSharp.RegularAnalysis.TextRegex { // phase0: scan container and remove no parent nodes _tree.AllNodes.RemoveWhere(node => node.Parent == null && node != _tree.Root); - HashSet.Enumerator enumerator = _tree.AllNodes.GetEnumerator(); + TreeEnumerator enumerator = new TreeEnumerator(_tree.Root); + RegexAstNode current; // phase1: ALT flatten + // phase2: CONCAT normalize while (enumerator.MoveNext()) { - RegexAstNode node = enumerator.Current; - if ((RegexElementLabel)node.NodeFlag == RegexElementLabel.ALT) + current = enumerator.Current; + if (current.EqualityTypeConvert == RegexElementLabel.ALT) { - RegexAstNode list = FlattenAlt(node); - node.Left = list; - node.Right = RegexAstNode.Empty; + RegexAstNode union = FlattenAlt(current); + current.Right = union; + current.Left = RegexAstNode.Empty; + } else if (current.EqualityTypeConvert == RegexElementLabel.CONCAT) { + RotateConcat(current); } } - // phase2: ALT merge - - // phase3: CONCAT merge + enumerator.Reset(); + while (enumerator.MoveNext()) + { + // suppose all concat is now in normalized form, + // we can merge adjacent unit nodes into a single unit node with string value + current = enumerator.Current; + if (current.EqualityTypeConvert == RegexElementLabel.CONCAT) { + MergeConcat(current); + } + } + + // phase4: ALT union } private void ProcessOperator( diff --git a/StgSharp.RegularAnalysis/TextRegex/RegexTokenReader.cs b/StgSharp.RegularAnalysis/TextRegex/RegexTokenReader.cs index af43e523..68922948 100644 --- a/StgSharp.RegularAnalysis/TextRegex/RegexTokenReader.cs +++ b/StgSharp.RegularAnalysis/TextRegex/RegexTokenReader.cs @@ -65,7 +65,7 @@ namespace StgSharp.RegularAnalysis.TextRegex } position = pos + 2; return new Token(_source[(pos)..(pos + 2)], 0, pos, - RegexElementLabel.UNIT); + RegexElementLabel.UNIT_SET); case '[': for (int i = pos + 1; i < _source.Length; i++) {