Skip to main content

TaskBudget

Struct TaskBudget 

Source
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

Source

pub const RING0_EVENT_NS: u64 = 500

Single event processing budget: 500ns

Source

pub const RING0_BATCH_NS: u64 = 5_000

Batch of events budget: 5μs (up to ~10 events)

Source

pub const RING0_LOOKUP_NS: u64 = 200

State lookup budget: 200ns

Source

pub const RING0_WINDOW_NS: u64 = 10_000

Window trigger budget: 10μs

Source

pub const RING0_ITERATION_NS: u64 = 10_000

Iteration budget: 10μs (for one reactor poll cycle)

Source

pub const RING1_CHUNK_NS: u64 = 1_000_000

Background work chunk budget: 1ms

Source

pub const RING1_CHECKPOINT_NS: u64 = 10_000_000

Checkpoint preparation budget: 10ms

Source

pub const RING1_WAL_FLUSH_NS: u64 = 100_000

WAL flush budget: 100μs

Source

pub const RING1_COMPACTION_NS: u64 = 5_000_000

Compaction chunk budget: 5ms

Source

pub fn ring0_event() -> Self

Create budget for Ring 0 single event.

Budget: 500ns

Source

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.

Source

pub fn ring0_batch() -> Self

Create budget for Ring 0 batch of events.

Budget: 5μs

Source

pub fn ring0_lookup() -> Self

Create budget for Ring 0 state lookup.

Budget: 200ns

Source

pub fn ring0_window() -> Self

Create budget for Ring 0 window trigger.

Budget: 10μs

Source

pub fn ring0_iteration() -> Self

Create budget for Ring 0 iteration (one poll cycle).

Budget: 10μs

Source

pub fn ring1_chunk() -> Self

Create budget for Ring 1 background chunk.

Budget: 1ms

Source

pub fn ring1_checkpoint() -> Self

Create budget for Ring 1 checkpoint preparation.

Budget: 10ms

Source

pub fn ring1_wal_flush() -> Self

Create budget for Ring 1 WAL flush.

Budget: 100μs

Source

pub fn ring1_compaction() -> Self

Create budget for Ring 1 compaction chunk.

Budget: 5ms

Source

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
Source

pub fn custom_untracked(name: &'static str, ring: u8, budget_ns: u64) -> Self

Create a custom budget without metrics recording.

Source

pub fn name(&self) -> &'static str

Get the task name.

Source

pub fn ring(&self) -> u8

Get the ring number.

Source

pub fn budget_ns(&self) -> u64

Get the budget in nanoseconds.

Source

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
Source

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
Source

pub fn exceeded(&self) -> bool

Check if budget is exceeded.

Source

pub fn almost_exceeded(&self) -> bool

Check if budget is almost exceeded (>80% used).

Useful for early warnings and preemptive yielding.

Source

pub fn half_used(&self) -> bool

Check if budget is half used (>50%).

Useful for chunking decisions.

Source

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

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for TaskBudget

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
Source§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

Source§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
Source§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,