mirror of
https://github.com/servo/servo.git
synced 2025-08-02 04:00:32 +01:00
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.
This commit is contained in:
parent
5b2f2c5505
commit
edf00a50fc
1 changed files with 3 additions and 4 deletions
|
@ -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
|
||||
},
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue