mirror of
https://github.com/servo/servo.git
synced 2025-06-21 15:49:04 +01:00
layout: Profile layout damage propagation and group "style recalc" (as
WebKit calls it) into one supercategory in the profiler
This commit is contained in:
parent
6c63de1c03
commit
21656b874d
2 changed files with 54 additions and 37 deletions
|
@ -508,47 +508,53 @@ impl LayoutTask {
|
||||||
// Create a layout context for use throughout the following passes.
|
// Create a layout context for use throughout the following passes.
|
||||||
let mut layout_ctx = self.build_layout_context(node);
|
let mut layout_ctx = self.build_layout_context(node);
|
||||||
|
|
||||||
// Initialize layout data for each node.
|
let mut layout_root = profile(time::LayoutStyleRecalcCategory,
|
||||||
//
|
self.profiler_chan.clone(),
|
||||||
// FIXME: This is inefficient. We don't need an entire traversal to do this!
|
|| {
|
||||||
profile(time::LayoutAuxInitCategory, self.profiler_chan.clone(), || {
|
// Initialize layout data for each node.
|
||||||
node.initialize_style_for_subtree(self.chan.clone());
|
//
|
||||||
});
|
// FIXME: This is inefficient. We don't need an entire traversal to do this!
|
||||||
|
profile(time::LayoutAuxInitCategory, self.profiler_chan.clone(), || {
|
||||||
|
node.initialize_style_for_subtree(self.chan.clone());
|
||||||
|
});
|
||||||
|
|
||||||
// Perform CSS selector matching if necessary.
|
// Perform CSS selector matching if necessary.
|
||||||
match data.damage.level {
|
match data.damage.level {
|
||||||
ReflowDocumentDamage => {}
|
ReflowDocumentDamage => {}
|
||||||
_ => {
|
_ => {
|
||||||
profile(time::LayoutSelectorMatchCategory, self.profiler_chan.clone(), || {
|
profile(time::LayoutSelectorMatchCategory, self.profiler_chan.clone(), || {
|
||||||
match self.parallel_traversal {
|
match self.parallel_traversal {
|
||||||
None => node.match_subtree(self.stylist),
|
None => node.match_subtree(self.stylist),
|
||||||
Some(ref mut traversal) => {
|
Some(ref mut traversal) => {
|
||||||
parallel::match_and_cascade_subtree(node, &mut layout_ctx, traversal)
|
parallel::match_and_cascade_subtree(node, &mut layout_ctx, traversal)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// If we're doing layout sequentially, do the cascade separately.
|
|
||||||
//
|
|
||||||
// TODO(pcwalton): Integrate this into `match_subtree`.
|
|
||||||
if self.parallel_traversal.is_none() {
|
|
||||||
profile(time::LayoutSelectorCascadeCategory, self.profiler_chan.clone(), || {
|
|
||||||
node.cascade_subtree(None);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// If we're doing layout sequentially, do the cascade separately.
|
||||||
|
//
|
||||||
|
// TODO(pcwalton): Integrate this into `match_subtree`.
|
||||||
|
if self.parallel_traversal.is_none() {
|
||||||
|
profile(time::LayoutSelectorCascadeCategory, self.profiler_chan.clone(), || {
|
||||||
|
node.cascade_subtree(None);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Construct the flow tree.
|
// Construct the flow tree.
|
||||||
let mut layout_root = profile(time::LayoutTreeBuilderCategory,
|
profile(time::LayoutTreeBuilderCategory,
|
||||||
self.profiler_chan.clone(),
|
self.profiler_chan.clone(),
|
||||||
|| self.construct_flow_tree(&mut layout_ctx, *node));
|
|| self.construct_flow_tree(&mut layout_ctx, *node))
|
||||||
|
});
|
||||||
|
|
||||||
// Propagate damage.
|
// Propagate damage.
|
||||||
layout_root.traverse_preorder(&mut PropagateDamageTraversal {
|
profile(time::LayoutDamagePropagateCategory, self.profiler_chan.clone(), || {
|
||||||
all_style_damage: all_style_damage
|
layout_root.traverse_preorder(&mut PropagateDamageTraversal {
|
||||||
|
all_style_damage: all_style_damage
|
||||||
|
});
|
||||||
|
layout_root.traverse_postorder(&mut ComputeDamageTraversal.clone());
|
||||||
});
|
});
|
||||||
layout_root.traverse_postorder(&mut ComputeDamageTraversal.clone());
|
|
||||||
|
|
||||||
// Perform the primary layout passes over the flow tree to compute the locations of all
|
// Perform the primary layout passes over the flow tree to compute the locations of all
|
||||||
// the boxes.
|
// the boxes.
|
||||||
|
|
|
@ -50,10 +50,12 @@ pub enum ProfilerCategory {
|
||||||
CompositingCategory,
|
CompositingCategory,
|
||||||
LayoutQueryCategory,
|
LayoutQueryCategory,
|
||||||
LayoutPerformCategory,
|
LayoutPerformCategory,
|
||||||
|
LayoutStyleRecalcCategory,
|
||||||
LayoutAuxInitCategory,
|
LayoutAuxInitCategory,
|
||||||
LayoutSelectorMatchCategory,
|
LayoutSelectorMatchCategory,
|
||||||
LayoutSelectorCascadeCategory,
|
LayoutSelectorCascadeCategory,
|
||||||
LayoutTreeBuilderCategory,
|
LayoutTreeBuilderCategory,
|
||||||
|
LayoutDamagePropagateCategory,
|
||||||
LayoutMainCategory,
|
LayoutMainCategory,
|
||||||
LayoutParallelWarmupCategory,
|
LayoutParallelWarmupCategory,
|
||||||
LayoutShapingCategory,
|
LayoutShapingCategory,
|
||||||
|
@ -78,6 +80,7 @@ impl ProfilerCategory {
|
||||||
buckets.insert(CompositingCategory, ~[]);
|
buckets.insert(CompositingCategory, ~[]);
|
||||||
buckets.insert(LayoutQueryCategory, ~[]);
|
buckets.insert(LayoutQueryCategory, ~[]);
|
||||||
buckets.insert(LayoutPerformCategory, ~[]);
|
buckets.insert(LayoutPerformCategory, ~[]);
|
||||||
|
buckets.insert(LayoutStyleRecalcCategory, ~[]);
|
||||||
buckets.insert(LayoutAuxInitCategory, ~[]);
|
buckets.insert(LayoutAuxInitCategory, ~[]);
|
||||||
buckets.insert(LayoutSelectorMatchCategory, ~[]);
|
buckets.insert(LayoutSelectorMatchCategory, ~[]);
|
||||||
buckets.insert(LayoutSelectorCascadeCategory, ~[]);
|
buckets.insert(LayoutSelectorCascadeCategory, ~[]);
|
||||||
|
@ -85,6 +88,7 @@ impl ProfilerCategory {
|
||||||
buckets.insert(LayoutMainCategory, ~[]);
|
buckets.insert(LayoutMainCategory, ~[]);
|
||||||
buckets.insert(LayoutParallelWarmupCategory, ~[]);
|
buckets.insert(LayoutParallelWarmupCategory, ~[]);
|
||||||
buckets.insert(LayoutShapingCategory, ~[]);
|
buckets.insert(LayoutShapingCategory, ~[]);
|
||||||
|
buckets.insert(LayoutDamagePropagateCategory, ~[]);
|
||||||
buckets.insert(LayoutDispListBuildCategory, ~[]);
|
buckets.insert(LayoutDispListBuildCategory, ~[]);
|
||||||
buckets.insert(GfxRegenAvailableFontsCategory, ~[]);
|
buckets.insert(GfxRegenAvailableFontsCategory, ~[]);
|
||||||
buckets.insert(RenderingDrawingCategory, ~[]);
|
buckets.insert(RenderingDrawingCategory, ~[]);
|
||||||
|
@ -98,9 +102,16 @@ impl ProfilerCategory {
|
||||||
// and should be printed to indicate this
|
// and should be printed to indicate this
|
||||||
pub fn format(self) -> ~str {
|
pub fn format(self) -> ~str {
|
||||||
let padding = match self {
|
let padding = match self {
|
||||||
LayoutAuxInitCategory | LayoutSelectorMatchCategory | LayoutSelectorCascadeCategory |
|
LayoutStyleRecalcCategory |
|
||||||
LayoutTreeBuilderCategory | LayoutMainCategory | LayoutDispListBuildCategory |
|
LayoutMainCategory |
|
||||||
LayoutShapingCategory | LayoutParallelWarmupCategory => " - ",
|
LayoutDispListBuildCategory |
|
||||||
|
LayoutShapingCategory |
|
||||||
|
LayoutDamagePropagateCategory => "+ ",
|
||||||
|
LayoutAuxInitCategory |
|
||||||
|
LayoutSelectorCascadeCategory |
|
||||||
|
LayoutParallelWarmupCategory |
|
||||||
|
LayoutSelectorMatchCategory |
|
||||||
|
LayoutTreeBuilderCategory => "| + ",
|
||||||
_ => ""
|
_ => ""
|
||||||
};
|
};
|
||||||
format!("{:s}{:?}", padding, self)
|
format!("{:s}{:?}", padding, self)
|
||||||
|
@ -190,7 +201,7 @@ impl Profiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_buckets(&mut self) {
|
fn print_buckets(&mut self) {
|
||||||
println(format!("{:31s} {:15s} {:15s} {:15s} {:15s} {:15s}",
|
println(format!("{:39s} {:15s} {:15s} {:15s} {:15s} {:15s}",
|
||||||
"_category_", "_mean (ms)_", "_median (ms)_",
|
"_category_", "_mean (ms)_", "_median (ms)_",
|
||||||
"_min (ms)_", "_max (ms)_", "_bucket size_"));
|
"_min (ms)_", "_max (ms)_", "_bucket size_"));
|
||||||
for (category, data) in self.buckets.iter() {
|
for (category, data) in self.buckets.iter() {
|
||||||
|
@ -210,7 +221,7 @@ impl Profiler {
|
||||||
data[data_len / 2],
|
data[data_len / 2],
|
||||||
data.iter().min().unwrap(),
|
data.iter().min().unwrap(),
|
||||||
data.iter().max().unwrap());
|
data.iter().max().unwrap());
|
||||||
println(format!("{:-30s}: {:15.4f} {:15.4f} {:15.4f} {:15.4f} {:15u}",
|
println(format!("{:-35s}: {:15.4f} {:15.4f} {:15.4f} {:15.4f} {:15u}",
|
||||||
category.format(), mean, median, min, max, data_len));
|
category.format(), mean, median, min, max, data_len));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue