mirror of
https://github.com/storytold/wordcraft.git
synced 2026-11-10 20:51:50 +00:00
anchors_walk_dense_unrelated_markers_in_linear_work compared CPU times of a few microseconds, so cache and timer noise could push the ratio past its 24x limit on a linear walk (43.52x in a CI run). wordcraft-doc now counts, in tests only, the characters its paragraph object lookups walk (objects_before, object_offsets and objects_with_offsets), through a work::count helper behind the existing test-support feature. The test asserts that 8x the markers take at most 12x the steps, as the layout linear-time tests do: the walk takes 2001 -> 16001 steps (8.0x), and the object_offsets + object_at walk it replaced takes 2003001 -> 128024001 (63.9x).
29 lines
1.1 KiB
Rust
29 lines
1.1 KiB
Rust
//! A count of the characters a paragraph's object lookups walk, for the linear-time tests of the
|
|
//! crates that use them: an input 8x the size must cost about 8x the steps, which a busy machine
|
|
//! can't skew the way it skews a timing. Counted only in tests (this crate's, and other crates'
|
|
//! through the `test-support` feature, which they turn on as a dev-dependency); in the app the
|
|
//! count is nothing.
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
thread_local! {
|
|
/// The steps counted on this thread.
|
|
static STEPS: std::cell::Cell<u64> = const { std::cell::Cell::new(0) };
|
|
}
|
|
|
|
/// Count `n` steps of a walk (nothing outside tests).
|
|
#[inline(always)]
|
|
pub(crate) fn steps(n: usize) {
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
STEPS.with(|s| s.set(s.get().saturating_add(n as u64)));
|
|
#[cfg(not(any(test, feature = "test-support")))]
|
|
let _ = n;
|
|
}
|
|
|
|
/// The steps `f` takes.
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
pub fn count(f: impl FnOnce()) -> u64 {
|
|
let before = STEPS.with(std::cell::Cell::get);
|
|
f();
|
|
STEPS.with(std::cell::Cell::get).saturating_sub(before)
|
|
}
|