#types #number #live #struct #widget

countme

Counts the number of live instances of types

9 stable releases

2.0.4 Jan 28, 2021
2.0.3 Jan 27, 2021
2.0.0 Jan 25, 2021
2.0.0-pre.2 Jan 21, 2021
1.0.3 Jan 16, 2021

#21 in Profiling

Download history 66/week @ 2021-01-12 804/week @ 2021-01-19 1858/week @ 2021-01-26 3054/week @ 2021-02-02 3001/week @ 2021-02-09 3944/week @ 2021-02-16 3653/week @ 2021-02-23

522 downloads per month
Used in 31 crates (2 directly)

MIT/Apache

10KB
206 lines

A library to quickly get the live/total/max counts of allocated instances.

#[derive(Default)]
struct Widget {
  _c: countme::Count<Self>,
  ...
}

let w1 = Widget::default();
let w2 = Widget::default();
let w3 = Widget::default();
drop(w1);

let counts = countme::get::<Widget>();
assert_eq!(counts.live, 2);
assert_eq!(counts.max_live, 3);
assert_eq!(counts.total, 3);

eprintln!("{}", countme::get_all());

lib.rs:

A library to quickly get the live/total/max counts of allocated instances.

Example

# if cfg!(not(feature = "enable")) { return; }

#[derive(Default)]
struct Widget {
  _c: countme::Count<Self>,
}

countme::enable(true);

let w1 = Widget::default();
let w2 = Widget::default();
let w3 = Widget::default();
drop(w1);

let counts = countme::get::<Widget>();
assert_eq!(counts.live, 2);
assert_eq!(counts.max_live, 3);
assert_eq!(counts.total, 3);

eprintln!("{}", countme::get_all());

Configuration

By default, the implementation compiles to no-ops. Therefore it is possible to include Count fields into library types.

The enable cargo feature ungates the counting code. The feature can be enabled anywhere in the crate graph.

At run-time, the counters are controlled with [enable] function. Counting is disabled by default. Call enable(true) early in main to enable:

fn main() {
    countme::enable(std::env::var("COUNTME").is_ok());
}

The code is optimized for the case where counting is not enabled at runtime (counting is a relaxed load and a branch to a function call).

The print_at_exit Cargo feature uses atexit call to print final counts before the program exits (it also enables counting at runtime). Use it only when you can't modify the main to print counts -- atexit is not guaranteed to work with rust's runtime.

Dependencies

~52KB