Skip to content

Comments

perf(usenet): lazy on-demand segment loading#319

Merged
javi11 merged 1 commit intomainfrom
feat/lazy-segment-loading
Feb 24, 2026
Merged

perf(usenet): lazy on-demand segment loading#319
javi11 merged 1 commit intomainfrom
feat/lazy-segment-loading

Conversation

@javi11
Copy link
Owner

@javi11 javi11 commented Feb 24, 2026

Summary

  • Defer buildSegmentIndex: Moved the O(n) segment offset index build from OpenFile to createUsenetReader, protected by sync.Once. Files that are only stat'd or listed never pay the index cost.
  • Lazy segmentRange: segmentRange now supports a SegmentLoader + index metadata and creates *segment objects on demand (createSegmentLocked) instead of eagerly iterating all segments upfront via GetSegmentsInRangeFromIndex.
  • Direct NewLazySegmentRange: createUsenetReader now calls NewLazySegmentRange directly (O(1) init) instead of routing through BuildSegmentRange, since the segment index is always available at read time.

Performance Impact

Stage Before After
OpenFile O(n) index build over all segments O(1)
First read O(1) (index pre-built) O(n) index build + O(log n) lookup
Subsequent reads O(log n) binary search O(log n) binary search
segmentRange init O(N) eager segment creation O(1) slot allocation
Per-segment object creation Upfront On demand as downloader advances

Files only accessed via stat/readdir/metadata operations pay zero segment processing cost.

- Move buildSegmentIndex from OpenFile to createUsenetReader, guarded by
  sync.Once so the O(n) index build is deferred until the file is actually read
- Add lazy segmentRange: segmentRange now holds a SegmentLoader + index
  metadata and creates *segment objects on demand via createSegmentLocked,
  replacing the O(N) eager GetSegmentsInRangeFromIndex path
- createUsenetReader now calls NewLazySegmentRange directly (O(1) init)
  instead of routing through BuildSegmentRange, since the index is always
  available at read time
- Files that are only stat'd or listed in directories incur zero segment
  processing cost; first actual read triggers the one-time O(n) index build
  followed by O(log n) binary search per range lookup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@javi11 javi11 merged commit e1135ad into main Feb 24, 2026
1 check passed
@javi11 javi11 deleted the feat/lazy-segment-loading branch February 24, 2026 08:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant