Add weighted telemetry probes for parallel restyles

This commit is contained in:
Manish Goregaokar 2017-11-28 14:42:59 -08:00 committed by Manish Goregaokar
parent d573081fe5
commit 337e5288c2
6 changed files with 84 additions and 26 deletions

View file

@ -7,7 +7,7 @@
#![deny(missing_docs)]
use context::{StyleContext, ThreadLocalStyleContext};
use context::{StyleContext, ThreadLocalStyleContext, TraversalStatistics};
use dom::{SendNode, TElement, TNode};
use parallel;
use parallel::{DispatchMode, WORK_UNIT_MAX};
@ -26,12 +26,14 @@ use traversal::{DomTraversal, PerLevelTraversalData, PreTraverseToken};
/// parallel traversal would parallelize it. If a thread pool is provided, we
/// then transfer control over to the parallel traversal.
///
/// Returns true if the traversal was parallel
/// Returns true if the traversal was parallel, and also returns the statistics
/// object containing information on nodes traversed (on nightly only). Not
/// all of its fields will be initialized since we don't call finish().
pub fn traverse_dom<E, D>(
traversal: &D,
token: PreTraverseToken<E>,
pool: Option<&rayon::ThreadPool>
) -> bool
) -> (bool, Option<TraversalStatistics>)
where
E: TElement,
D: DomTraversal<E>,
@ -40,6 +42,7 @@ where
token.traversal_root().expect("Should've ensured we needed to traverse");
let dump_stats = traversal.shared_context().options.dump_style_statistics;
let is_nightly = traversal.shared_context().options.is_nightly();
let mut used_parallel = false;
let start_time = if dump_stats { Some(time::precise_time_s()) } else { None };
@ -112,9 +115,9 @@ where
nodes_remaining_at_current_depth = discovered.len();
}
}
// Dump statistics to stdout if requested.
if dump_stats {
let mut maybe_stats = None;
// Accumulate statistics
if dump_stats || is_nightly {
let mut aggregate =
mem::replace(&mut context.thread_local.statistics, Default::default());
let parallel = maybe_tls.is_some();
@ -127,11 +130,14 @@ where
}
});
}
aggregate.finish(traversal, parallel, start_time.unwrap());
if aggregate.is_large_traversal() {
println!("{}", aggregate);
// dump to stdout if requested
if dump_stats && aggregate.is_large_traversal() {
aggregate.finish(traversal, parallel, start_time.unwrap());
println!("{}", aggregate);
}
maybe_stats = Some(aggregate);
}
used_parallel
(used_parallel, maybe_stats)
}