diff --git a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs index 712df90..ee8c387 100644 --- a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs +++ b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializationContext.cs @@ -132,15 +132,14 @@ public static partial class AcBinarySerializer /// /// Sorts write plan by VisitIndex for sequential cursor consumption in write pass. - /// Called once after scan pass completes. Pre-loads first entry for TryConsumeWritePlanEntry. + /// Called once after scan pass completes. /// internal void SortWritePlan() { if (_writePlanCount > 1) _writePlan.AsSpan(0, _writePlanCount).Sort(static (a, b) => a.VisitIndex.CompareTo(b.VisitIndex)); - if (_writePlanCount > 0) - _nextWritePlanEntry = _writePlan![0]; + _nextWritePlanVisitIndex = _writePlanCount > 0 ? _writePlan![0].VisitIndex : int.MaxValue; } /// Write pass cursor index into sorted _writePlan array. @@ -150,10 +149,9 @@ public static partial class AcBinarySerializer internal int WriteVisitIndex; /// - /// Pre-loaded next write plan entry. Null when plan is empty or exhausted. - /// Avoids array access on hit path — entry is already cached. + /// Pre-cached VisitIndex of the next write plan entry, or int.MaxValue when exhausted. /// - private WriteDuplicateEntry? _nextWritePlanEntry; + private int _nextWritePlanVisitIndex = int.MaxValue; /// /// Set per-property in WritePropertyOrSkip before calling WriteString. @@ -171,13 +169,12 @@ public static partial class AcBinarySerializer internal bool TryConsumeWritePlanEntry(out WriteDuplicateEntry entry) { var visitIndex = WriteVisitIndex++; - var next = _nextWritePlanEntry; - if (next != null && visitIndex == next.Value.VisitIndex) + if (visitIndex == _nextWritePlanVisitIndex) { - entry = next.Value; - _nextWritePlanEntry = ++WritePlanCursor < _writePlanCount - ? _writePlan![WritePlanCursor] - : null; + entry = _writePlan![WritePlanCursor++]; + _nextWritePlanVisitIndex = WritePlanCursor < _writePlanCount + ? _writePlan[WritePlanCursor].VisitIndex + : int.MaxValue; return true; } entry = default; @@ -300,7 +297,7 @@ public static partial class AcBinarySerializer ScanVisitIndex = 0; WritePlanCursor = 0; WriteVisitIndex = 0; - _nextWritePlanEntry = null; + _nextWritePlanVisitIndex = int.MaxValue; StringInternEligible = false; // Clear write plan string references to avoid GC pinning, keep array if small enough