Class Sealed
public sealed class LazyDebugStats

Namespace: Moka.Blazor.Json.Models

Debug statistics for lazy JSON document source. Used by Moka.Blazor.Json.Diagnostics to render the debug overlay.

Properties

NameDescription
AvgParseTime Average subtree parse time.
CacheHitRate Cache hit rate as a percentage.
CacheHits Number of times a cached subtree was reused.
CacheMisses Number of times a subtree had to be parsed fresh (cache miss).
CoveragePercent Percentage of unique document bytes that have been parsed.
CumulativeBytesParsed Cumulative bytes parsed across all parse calls (may double-count overlapping regions).
IndexEntries Number of entries in the structural index.
LazyIndexOps Number of lazy child-indexing operations.
MaxParseTime Slowest subtree parse.
MinParseTime Fastest subtree parse.
RecentParses Recent parse operations with path, size, and duration.
SubtreeParseCount Total number of subtree parse operations (including overlapping regions).
TotalBytes Total document size in bytes.
TotalParseTime Total time spent parsing subtrees.
UniqueBytesParsed Unique bytes covered by at least one parse (no double-counting).

AvgParseTime

public TimeSpan AvgParseTime { get; }

Average subtree parse time.

CacheHitRate

public double CacheHitRate { get; }

Cache hit rate as a percentage.

CacheHits

public int CacheHits { get; }

Number of times a cached subtree was reused.

CacheMisses

public int CacheMisses { get; }

Number of times a subtree had to be parsed fresh (cache miss).

CoveragePercent

public double CoveragePercent { get; }

Percentage of unique document bytes that have been parsed.

CumulativeBytesParsed

public long CumulativeBytesParsed { get; private set; }

Cumulative bytes parsed across all parse calls (may double-count overlapping regions).

IndexEntries

public int IndexEntries { get; set; }

Number of entries in the structural index.

LazyIndexOps

public int LazyIndexOps { get; }

Number of lazy child-indexing operations.

MaxParseTime

public TimeSpan MaxParseTime { get; private set; }

Slowest subtree parse.

MinParseTime

public TimeSpan MinParseTime { get; private set; }

Fastest subtree parse.

RecentParses

public List<LazyParseEntry> RecentParses { get; }

Recent parse operations with path, size, and duration.

SubtreeParseCount

public int SubtreeParseCount { get; private set; }

Total number of subtree parse operations (including overlapping regions).

TotalBytes

public long TotalBytes { get; set; }

Total document size in bytes.

TotalParseTime

public TimeSpan TotalParseTime { get; private set; }

Total time spent parsing subtrees.

UniqueBytesParsed

public long UniqueBytesParsed { get; private set; }

Unique bytes covered by at least one parse (no double-counting).

Methods

NameDescription
RecordCacheHit() Records a cache hit.
RecordCacheMiss() Records a cache miss.
RecordLazyIndex() Records a lazy index operation.
RecordParse(…) Records a subtree parse operation.

RecordCacheHit()

public void RecordCacheHit()

Records a cache hit.

RecordCacheMiss()

public void RecordCacheMiss()

Records a cache miss.

RecordLazyIndex()

public void RecordLazyIndex()

Records a lazy index operation.

RecordParse(string path, long startOffset, long length, TimeSpan duration)

public void RecordParse(string path, long startOffset, long length, TimeSpan duration)

Records a subtree parse operation.

View Source
/// <summary>
///     Debug statistics for lazy JSON document source.
///     Used by Moka.Blazor.Json.Diagnostics to render the debug overlay.
/// </summary>
public sealed class LazyDebugStats
{
    /// <summary>Total document size in bytes.</summary>
    public long TotalBytes { get; set; }
    /// <summary>Number of entries in the structural index.</summary>
    public int IndexEntries { get; set; }
    /// <summary>Total number of subtree parse operations (including overlapping regions).</summary>
    public int SubtreeParseCount { get; private set; }
    /// <summary>Cumulative bytes parsed across all parse calls (may double-count overlapping regions).</summary>
    public long CumulativeBytesParsed { get; private set; }
    /// <summary>Unique bytes covered by at least one parse (no double-counting).</summary>
    public long UniqueBytesParsed { get; private set; }
    /// <summary>Number of times a cached subtree was reused.</summary>
    public int CacheHits => _cacheHits;
    /// <summary>Number of times a subtree had to be parsed fresh (cache miss).</summary>
    public int CacheMisses => _cacheMisses;
    /// <summary>Number of lazy child-indexing operations.</summary>
    public int LazyIndexOps => _lazyIndexOps;
    /// <summary>Total time spent parsing subtrees.</summary>
    public TimeSpan TotalParseTime { get; private set; }
    /// <summary>Fastest subtree parse.</summary>
    public TimeSpan MinParseTime { get; private set; } = TimeSpan.MaxValue;
    /// <summary>Slowest subtree parse.</summary>
    public TimeSpan MaxParseTime { get; private set; }
    /// <summary>Average subtree parse time.</summary>
    public TimeSpan AvgParseTime => SubtreeParseCount > 0 ? TotalParseTime / SubtreeParseCount : TimeSpan.Zero;
    /// <summary>Percentage of unique document bytes that have been parsed.</summary>
    public double CoveragePercent => TotalBytes > 0 ? (double)UniqueBytesParsed / TotalBytes * 100 : 0;

    /// <summary>Cache hit rate as a percentage.</summary>
    public double CacheHitRate
    {
        get
        {
            int total = _cacheHits + _cacheMisses;
            return total > 0 ? (double)_cacheHits / total * 100 : 0;
        }
    }

    /// <summary>Recent parse operations with path, size, and duration.</summary>
    public List<LazyParseEntry> RecentParses { get; } = new(20);

    /// <summary>Records a subtree parse operation.</summary>
    public void RecordParse(string path, long startOffset, long length, TimeSpan duration)
    {
        lock (_lock)
        {
            SubtreeParseCount++;
            CumulativeBytesParsed += length;
            TotalParseTime += duration;
            if (duration < MinParseTime)
            {
                MinParseTime = duration;
            }

            if (duration > MaxParseTime)
            {
                MaxParseTime = duration;
            }

            AddRegion(new ParsedRegion(startOffset, startOffset + length));
            if (RecentParses.Count >= 20)
            {
                RecentParses.RemoveAt(0);
            }

            RecentParses.Add(new LazyParseEntry(path, length, duration));
        }
    }

    /// <summary>Records a cache hit.</summary>
    public void RecordCacheHit() => Interlocked.Increment(ref _cacheHits);
    /// <summary>Records a cache miss.</summary>
    public void RecordCacheMiss() => Interlocked.Increment(ref _cacheMisses);
    /// <summary>Records a lazy index operation.</summary>
    public void RecordLazyIndex() => Interlocked.Increment(ref _lazyIndexOps);
}
Was this page helpful?