pub struct TaskBudget { /* private fields */ }Expand description
Tracks execution time budget for a task.
Created at task start, automatically records metrics on drop. Use for all Ring 0 operations and Ring 1 chunks.
§Example
use laminar_core::budget::TaskBudget;
fn process_event(event: &Event) {
let _budget = TaskBudget::ring0_event();
// Process event...
// Metrics recorded automatically when _budget is dropped
}§Performance
The budget tracking overhead is designed to be < 10ns, consisting of:
Instant::now()on creation (~10-30ns depending on platform)- Elapsed time calculation on drop (~10-30ns)
- Atomic counter increments for metrics (~10ns)
For Ring 0 hot paths where even this is too much, use TaskBudget::ring0_event_untracked()
which skips metrics recording.
Implementations§
Source§impl TaskBudget
impl TaskBudget
Sourcepub const RING0_EVENT_NS: u64 = 500
pub const RING0_EVENT_NS: u64 = 500
Single event processing budget: 500ns
Sourcepub const RING0_BATCH_NS: u64 = 5_000
pub const RING0_BATCH_NS: u64 = 5_000
Batch of events budget: 5μs (up to ~10 events)
Sourcepub const RING0_LOOKUP_NS: u64 = 200
pub const RING0_LOOKUP_NS: u64 = 200
State lookup budget: 200ns
Sourcepub const RING0_WINDOW_NS: u64 = 10_000
pub const RING0_WINDOW_NS: u64 = 10_000
Window trigger budget: 10μs
Sourcepub const RING0_ITERATION_NS: u64 = 10_000
pub const RING0_ITERATION_NS: u64 = 10_000
Iteration budget: 10μs (for one reactor poll cycle)
Sourcepub const RING1_CHUNK_NS: u64 = 1_000_000
pub const RING1_CHUNK_NS: u64 = 1_000_000
Background work chunk budget: 1ms
Sourcepub const RING1_CHECKPOINT_NS: u64 = 10_000_000
pub const RING1_CHECKPOINT_NS: u64 = 10_000_000
Checkpoint preparation budget: 10ms
Sourcepub const RING1_WAL_FLUSH_NS: u64 = 100_000
pub const RING1_WAL_FLUSH_NS: u64 = 100_000
WAL flush budget: 100μs
Sourcepub const RING1_COMPACTION_NS: u64 = 5_000_000
pub const RING1_COMPACTION_NS: u64 = 5_000_000
Compaction chunk budget: 5ms
Sourcepub fn ring0_event() -> Self
pub fn ring0_event() -> Self
Create budget for Ring 0 single event.
Budget: 500ns
Sourcepub fn ring0_event_untracked() -> Self
pub fn ring0_event_untracked() -> Self
Create budget for Ring 0 single event without metrics.
Use this in extremely hot paths where even atomic counter updates are too expensive.
Sourcepub fn ring0_batch() -> Self
pub fn ring0_batch() -> Self
Create budget for Ring 0 batch of events.
Budget: 5μs
Sourcepub fn ring0_lookup() -> Self
pub fn ring0_lookup() -> Self
Create budget for Ring 0 state lookup.
Budget: 200ns
Sourcepub fn ring0_window() -> Self
pub fn ring0_window() -> Self
Create budget for Ring 0 window trigger.
Budget: 10μs
Sourcepub fn ring0_iteration() -> Self
pub fn ring0_iteration() -> Self
Create budget for Ring 0 iteration (one poll cycle).
Budget: 10μs
Sourcepub fn ring1_chunk() -> Self
pub fn ring1_chunk() -> Self
Create budget for Ring 1 background chunk.
Budget: 1ms
Sourcepub fn ring1_checkpoint() -> Self
pub fn ring1_checkpoint() -> Self
Create budget for Ring 1 checkpoint preparation.
Budget: 10ms
Sourcepub fn ring1_wal_flush() -> Self
pub fn ring1_wal_flush() -> Self
Create budget for Ring 1 WAL flush.
Budget: 100μs
Sourcepub fn ring1_compaction() -> Self
pub fn ring1_compaction() -> Self
Create budget for Ring 1 compaction chunk.
Budget: 5ms
Sourcepub fn custom(name: &'static str, ring: u8, budget_ns: u64) -> Self
pub fn custom(name: &'static str, ring: u8, budget_ns: u64) -> Self
Create a custom budget.
§Arguments
name- Task name for metrics (must be a static string)ring- Ring number (0, 1, or 2)budget_ns- Budget in nanoseconds
Sourcepub fn custom_untracked(name: &'static str, ring: u8, budget_ns: u64) -> Self
pub fn custom_untracked(name: &'static str, ring: u8, budget_ns: u64) -> Self
Create a custom budget without metrics recording.
Sourcepub fn elapsed_ns(&self) -> u64
pub fn elapsed_ns(&self) -> u64
Get elapsed time in nanoseconds.
Note: Truncation from u128 to u64 is acceptable here because:
- u64 can hold ~584 years of nanoseconds
- Budget tracking is for sub-second operations
Sourcepub fn remaining_ns(&self) -> i64
pub fn remaining_ns(&self) -> i64
Get remaining budget in nanoseconds (negative if exceeded).
Returns a signed value where:
- Positive: nanoseconds of budget remaining
- Negative: nanoseconds over budget
Sourcepub fn almost_exceeded(&self) -> bool
pub fn almost_exceeded(&self) -> bool
Check if budget is almost exceeded (>80% used).
Useful for early warnings and preemptive yielding.
Sourcepub fn half_used(&self) -> bool
pub fn half_used(&self) -> bool
Check if budget is half used (>50%).
Useful for chunking decisions.
Sourcepub fn percentage_used(&self) -> u64
pub fn percentage_used(&self) -> u64
Get the percentage of budget used (0-100+).
Values over 100 indicate the budget was exceeded.
Trait Implementations§
Source§impl Debug for TaskBudget
impl Debug for TaskBudget
Auto Trait Implementations§
impl Freeze for TaskBudget
impl RefUnwindSafe for TaskBudget
impl Send for TaskBudget
impl Sync for TaskBudget
impl Unpin for TaskBudget
impl UnwindSafe for TaskBudget
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.