aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2014-01-29 11:41:22 -0800
committerPatrick Walton <pcwalton@mimiga.net>2014-01-29 11:41:22 -0800
commit21656b874d2632b79cf9dbdd322e330e72d2cada (patch)
tree1abc9cedc80d90352e3641ae41c37c59cda1c81d /src
parent6c63de1c03a99d55d1718829f9ba23dd09c69b54 (diff)
downloadservo-21656b874d2632b79cf9dbdd322e330e72d2cada.tar.gz
servo-21656b874d2632b79cf9dbdd322e330e72d2cada.zip
layout: Profile layout damage propagation and group "style recalc" (as
WebKit calls it) into one supercategory in the profiler
Diffstat (limited to 'src')
-rw-r--r--src/components/main/layout/layout_task.rs70
-rw-r--r--src/components/util/time.rs21
2 files changed, 54 insertions, 37 deletions
diff --git a/src/components/main/layout/layout_task.rs b/src/components/main/layout/layout_task.rs
index 9315b225781..61af5250de1 100644
--- a/src/components/main/layout/layout_task.rs
+++ b/src/components/main/layout/layout_task.rs
@@ -508,47 +508,53 @@ impl LayoutTask {
// Create a layout context for use throughout the following passes.
let mut layout_ctx = self.build_layout_context(node);
- // Initialize layout data for each node.
- //
- // 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());
- });
+ let mut layout_root = profile(time::LayoutStyleRecalcCategory,
+ self.profiler_chan.clone(),
+ || {
+ // Initialize layout data for each node.
+ //
+ // 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.
- match data.damage.level {
- ReflowDocumentDamage => {}
- _ => {
- profile(time::LayoutSelectorMatchCategory, self.profiler_chan.clone(), || {
- match self.parallel_traversal {
- None => node.match_subtree(self.stylist),
- Some(ref mut traversal) => {
- parallel::match_and_cascade_subtree(node, &mut layout_ctx, traversal)
+ // Perform CSS selector matching if necessary.
+ match data.damage.level {
+ ReflowDocumentDamage => {}
+ _ => {
+ profile(time::LayoutSelectorMatchCategory, self.profiler_chan.clone(), || {
+ match self.parallel_traversal {
+ None => node.match_subtree(self.stylist),
+ Some(ref mut 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.
- let mut layout_root = profile(time::LayoutTreeBuilderCategory,
- self.profiler_chan.clone(),
- || self.construct_flow_tree(&mut layout_ctx, *node));
+ // Construct the flow tree.
+ profile(time::LayoutTreeBuilderCategory,
+ self.profiler_chan.clone(),
+ || self.construct_flow_tree(&mut layout_ctx, *node))
+ });
// Propagate damage.
- layout_root.traverse_preorder(&mut PropagateDamageTraversal {
- all_style_damage: all_style_damage
+ profile(time::LayoutDamagePropagateCategory, self.profiler_chan.clone(), || {
+ 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
// the boxes.
diff --git a/src/components/util/time.rs b/src/components/util/time.rs
index 905f24afdab..049cc64e9f0 100644
--- a/src/components/util/time.rs
+++ b/src/components/util/time.rs
@@ -50,10 +50,12 @@ pub enum ProfilerCategory {
CompositingCategory,
LayoutQueryCategory,
LayoutPerformCategory,
+ LayoutStyleRecalcCategory,
LayoutAuxInitCategory,
LayoutSelectorMatchCategory,
LayoutSelectorCascadeCategory,
LayoutTreeBuilderCategory,
+ LayoutDamagePropagateCategory,
LayoutMainCategory,
LayoutParallelWarmupCategory,
LayoutShapingCategory,
@@ -78,6 +80,7 @@ impl ProfilerCategory {
buckets.insert(CompositingCategory, ~[]);
buckets.insert(LayoutQueryCategory, ~[]);
buckets.insert(LayoutPerformCategory, ~[]);
+ buckets.insert(LayoutStyleRecalcCategory, ~[]);
buckets.insert(LayoutAuxInitCategory, ~[]);
buckets.insert(LayoutSelectorMatchCategory, ~[]);
buckets.insert(LayoutSelectorCascadeCategory, ~[]);
@@ -85,6 +88,7 @@ impl ProfilerCategory {
buckets.insert(LayoutMainCategory, ~[]);
buckets.insert(LayoutParallelWarmupCategory, ~[]);
buckets.insert(LayoutShapingCategory, ~[]);
+ buckets.insert(LayoutDamagePropagateCategory, ~[]);
buckets.insert(LayoutDispListBuildCategory, ~[]);
buckets.insert(GfxRegenAvailableFontsCategory, ~[]);
buckets.insert(RenderingDrawingCategory, ~[]);
@@ -98,9 +102,16 @@ impl ProfilerCategory {
// and should be printed to indicate this
pub fn format(self) -> ~str {
let padding = match self {
- LayoutAuxInitCategory | LayoutSelectorMatchCategory | LayoutSelectorCascadeCategory |
- LayoutTreeBuilderCategory | LayoutMainCategory | LayoutDispListBuildCategory |
- LayoutShapingCategory | LayoutParallelWarmupCategory => " - ",
+ LayoutStyleRecalcCategory |
+ LayoutMainCategory |
+ LayoutDispListBuildCategory |
+ LayoutShapingCategory |
+ LayoutDamagePropagateCategory => "+ ",
+ LayoutAuxInitCategory |
+ LayoutSelectorCascadeCategory |
+ LayoutParallelWarmupCategory |
+ LayoutSelectorMatchCategory |
+ LayoutTreeBuilderCategory => "| + ",
_ => ""
};
format!("{:s}{:?}", padding, self)
@@ -190,7 +201,7 @@ impl Profiler {
}
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)_",
"_min (ms)_", "_max (ms)_", "_bucket size_"));
for (category, data) in self.buckets.iter() {
@@ -210,7 +221,7 @@ impl Profiler {
data[data_len / 2],
data.iter().min().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));
}
}