[turbopack-trace-server] Performance improvements for span event handling (#93179)
## What?
Performance improvements for the turbopack-trace-server, optimizing how
span events are stored, sorted, and retrieved.
## Why?
When processing large traces, the trace server was spending significant
time on:
1. Repeated sorting of events for each render in ExecutionOrder mode
2. Recomputing corrected self time on repeated lookups
3. Memory pressure from very large traces
## How?
### Lazy Sorting with LazySortedVec
Introduces a new `LazySortedVec<T>` data structure that stores events
unsorted and defers sorting until first read via `Deref`. Uses
`UnsafeCell` + `Once` for thread-safe one-time sorting. This avoids
repeated sorting overhead during trace ingestion.
### Pre-sorted Span Events by Start Time
- `SpanEvent::Child` now stores its `start: Timestamp` alongside the
index
- `SpanEvent` implements `Ord` to sort by start time (with SelfTime
before Child for equal timestamps)
- The viewer's `ExecutionOrder` mode no longer needs to sort - events
are already in order
### Cached Corrected Self Time
- `SpanEvent::SelfTime` now wraps a `SpanEventSelfTime` struct
containing an `OnceLock<Timestamp>` for `corrected_self_time`
- The expensive tree lookup is performed once and cached for subsequent
accesses
- `SpanEventSelfTimeRef` provides access to the cached value via
`corrected_self_time()`
### DROP_SPANS Environment Variable
Adds `DROP_SPANS=<count>` env var to skip the first N spans when loading
traces:
- Useful for reducing memory usage with very large traces
- Tracks dropped span IDs to also skip their subsequent events (End,
SelfTime, etc.)
- Stats output shows dropped span progress (e.g., "1000 spans, 500/1000
dropped")
<!-- NEXT_JS_LLM_PR -->
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>