aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Nethercote <nnethercote@mozilla.com>2015-02-15 21:16:32 -0800
committerNicholas Nethercote <nnethercote@mozilla.com>2015-02-15 21:23:35 -0800
commitedf00a50fc36e2c74a5392100a9d91a84d30a7cf (patch)
tree1f487c7915a008f68eda79352cf477927c0c7c9e
parent5b2f2c55057493a6d6b1b56d02173625fbe403a8 (diff)
downloadservo-edf00a50fc36e2c74a5392100a9d91a84d30a7cf.tar.gz
servo-edf00a50fc36e2c74a5392100a9d91a84d30a7cf.zip
Avoid bloom filter churn.
When a cached bloom filter is found during traversal, there are two cases, both of which currently do unnecessary allocations. This patch avoids these allocations. In the process, it renders correct two previously-incorrect comments, and moves one of those comments into a better spot. While scrolling moderately fast all the way through the "Guardians of the Galaxy" Wikipedia page, this patch (a) avoids 1.2 million calls to `clone()` and (b) replaces 111,000 `BloomFilter::new()` calls with `clear()` calls.
-rw-r--r--components/layout/traversal.rs7
1 files changed, 3 insertions, 4 deletions
diff --git a/components/layout/traversal.rs b/components/layout/traversal.rs
index c31d4dcde1a..8318b75465d 100644
--- a/components/layout/traversal.rs
+++ b/components/layout/traversal.rs
@@ -73,18 +73,17 @@ fn take_task_local_bloom_filter(parent_node: Option<LayoutNode>, layout_context:
}
// Found cached bloom filter.
(Some(parent), Some((mut bloom_filter, old_node, old_generation))) => {
- // Hey, the cached parent is our parent! We can reuse the bloom filter.
if old_node == layout_node_to_unsafe_layout_node(&parent) &&
old_generation == layout_context.shared.generation {
+ // Hey, the cached parent is our parent! We can reuse the bloom filter.
debug!("[{}] Parent matches (={}). Reusing bloom filter.", tid(), old_node.0);
- bloom_filter.clone()
} else {
// Oh no. the cached parent is stale. I guess we need a new one. Reuse the existing
// allocation to avoid malloc churn.
- *bloom_filter = BloomFilter::new();
+ bloom_filter.clear();
insert_ancestors_into_bloom_filter(&mut bloom_filter, parent, layout_context);
- bloom_filter
}
+ bloom_filter
},
}
})