diff options
Diffstat (limited to 'src/document/bench.rs')
| -rw-r--r-- | src/document/bench.rs | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/src/document/bench.rs b/src/document/bench.rs index 026cf7b..2b82036 100644 --- a/src/document/bench.rs +++ b/src/document/bench.rs @@ -684,9 +684,10 @@ fn screening_costs(workload: &str, doc: &Document) { } /// Where screening `changes` spends its time, per change judged: decoding them, their -/// operations placed (`inspect::Inspector`), and judging them (`rules::judge`), of which -/// reading the policy (`policy::of`) and, for scale, one read (the committer's member -/// entry). As screening judges most: the first ones in (the maps they make, which flush +/// operations placed (`inspect::Inspector`), and judging them, as screening does (what +/// is read at the same heads read once, `rules::Reads`) and afresh (`rules::judge`); of +/// that, reading the policy (`policy::of`) and, for scale, one read (the committer's +/// member entry). As screening judges most: the first ones in (the maps they make, which flush /// the batch), the rest judged at the heads after them (`screen`'s frontier). fn screening_parts(changes: &[automerge::Change]) { use crate::access::{policy, rules}; @@ -736,26 +737,28 @@ fn screening_parts(changes: &[automerge::Change]) { .iter() .map(|ops| ops.iter().map(|op| op.path.clone()).collect()) .collect(); - let judge = median(3, || { + let judge_all = |reads: &mut Option<rules::Reads>| { let started = Instant::now(); for (index, change) in rest.iter().enumerate() { - let judged = rules::judge( - &base, - Epoch::GENESIS, - &rules::Change { - hash: change.hash(), - deps: change.deps(), - seen: &seen, - committer: committers[index].as_deref(), - user: None, - paths: &paths[index], - ops: &ops[index], - }, - ); + let change = rules::Change { + hash: change.hash(), + deps: change.deps(), + seen: &seen, + committer: committers[index].as_deref(), + user: None, + paths: &paths[index], + ops: &ops[index], + }; + let judged = match reads { + Some(reads) => rules::judge_reading(&base, Epoch::GENESIS, &change, reads), + None => rules::judge(&base, Epoch::GENESIS, &change), + }; assert_eq!(judged, Ok(()), "every change taken"); } started.elapsed() - }); + }; + let judge = median(3, || judge_all(&mut Some(rules::Reads::default()))); + let afresh = median(3, || judge_all(&mut None)); let read_policy = median(3, || { let started = Instant::now(); for _ in rest { @@ -775,11 +778,12 @@ fn screening_parts(changes: &[automerge::Change]) { }); let per = |d: Duration| d.as_secs_f64() * 1e6 / rest.len().max(1) as f64; println!( - "{:<40} per change: decode {:.2} µs, place {:.2} µs, judge {:.2} µs (policy::of {:.2} µs, one read {:.2} µs)", + "{:<40} per change: decode {:.2} µs, place {:.2} µs, judge {:.2} µs (afresh {:.2} µs: policy::of {:.2} µs, one read {:.2} µs)", "", per(decode), per(place), per(judge), + per(afresh), per(read_policy), per(one_read), ); |
