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

@ -5,6 +5,7 @@
//! Data needed to style a Gecko document.
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
use context::TraversalStatistics;
use dom::TElement;
use gecko_bindings::bindings::{self, RawServoStyleSet};
use gecko_bindings::structs::{RawGeckoPresContextOwned, ServoStyleSetSizes, ServoStyleSheet};
@ -108,15 +109,40 @@ impl StylesheetInDocument for GeckoStyleSheet {
}
}
#[derive(Default)]
/// Helper struct for counting traversals
pub struct TraversalCount {
/// Total number of events
pub total_count: AtomicUsize,
/// Number of events which were parallel
pub parallel_count: AtomicUsize
}
impl TraversalCount {
fn record(&self, parallel: bool, count: u32) {
self.total_count.fetch_add(count as usize, Ordering::Relaxed);
if parallel {
self.parallel_count.fetch_add(count as usize, Ordering::Relaxed);
}
}
fn get(&self) -> (u32, u32) {
(self.total_count.load(Ordering::Relaxed) as u32,
self.parallel_count.load(Ordering::Relaxed) as u32)
}
}
/// The container for data that a Servo-backed Gecko document needs to style
/// itself.
pub struct PerDocumentStyleDataImpl {
/// Rule processor.
pub stylist: Stylist,
/// Total number of traversals that could have been parallel, for telemetry
pub total_traversal_count: AtomicUsize,
/// Number of parallel traversals
pub parallel_traversal_count: AtomicUsize,
/// Counter for traversals that could have been parallel, for telemetry
pub traversal_count: TraversalCount,
/// Counter for traversals, weighted by elements traversed,
pub traversal_count_traversed: TraversalCount,
/// Counter for traversals, weighted by elements styled,
pub traversal_count_styled: TraversalCount,
}
/// The data itself is an `AtomicRefCell`, which guarantees the proper semantics
@ -138,8 +164,9 @@ impl PerDocumentStyleData {
PerDocumentStyleData(AtomicRefCell::new(PerDocumentStyleDataImpl {
stylist: Stylist::new(device, quirks_mode.into()),
total_traversal_count: Default::default(),
parallel_traversal_count: Default::default(),
traversal_count: Default::default(),
traversal_count_traversed: Default::default(),
traversal_count_styled: Default::default(),
}))
}
@ -156,9 +183,16 @@ impl PerDocumentStyleData {
impl Drop for PerDocumentStyleDataImpl {
fn drop(&mut self) {
let total = self.total_traversal_count.load(Ordering::Relaxed) as u32;
let parallel = self.parallel_traversal_count.load(Ordering::Relaxed) as u32;
unsafe { bindings::Gecko_RecordTraversalStatistics(total, parallel) }
if !structs::GECKO_IS_NIGHTLY {
return
}
let (total, parallel) = self.traversal_count.get();
let (total_t, parallel_t) = self.traversal_count_traversed.get();
let (total_s, parallel_s) = self.traversal_count_styled.get();
unsafe { bindings::Gecko_RecordTraversalStatistics(total, parallel,
total_t, parallel_t,
total_s, parallel_s) }
}
}
@ -226,10 +260,11 @@ impl PerDocumentStyleDataImpl {
}
/// Record that a traversal happened for later collection as telemetry
pub fn record_traversal(&self, was_parallel: bool) {
self.total_traversal_count.fetch_add(1, Ordering::Relaxed);
if was_parallel {
self.parallel_traversal_count.fetch_add(1, Ordering::Relaxed);
pub fn record_traversal(&self, was_parallel: bool, stats: Option<TraversalStatistics>) {
self.traversal_count.record(was_parallel, 1);
if let Some(stats) = stats {
self.traversal_count_traversed.record(was_parallel, stats.elements_traversed);
self.traversal_count_styled.record(was_parallel, stats.elements_styled);
}
}
}

View file

@ -499,6 +499,8 @@ extern "C" {
pub fn Servo_SelectorList_Drop ( ptr : RawServoSelectorListOwned , ) ;
} extern "C" {
pub fn Servo_SourceSizeList_Drop ( ptr : RawServoSourceSizeListOwned , ) ;
} extern "C" {
pub fn Gecko_RecordTraversalStatistics ( total : u32 , parallel : u32 , total_t : u32 , parallel_t : u32 , total_s : u32 , parallel_s : u32 , ) ;
} extern "C" {
pub fn Gecko_IsInDocument ( node : RawGeckoNodeBorrowed , ) -> bool ;
} extern "C" {

File diff suppressed because one or more lines are too long