mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 12:05:15 +00:00
LibJS: Save min and max block addresses in CellAllocator
This allows to skip iterating through all allocated blocks in `find_min_and_max_block_addresses()`. With this change `collect_garbage()` in profiles of Discord goes down from 17% to 8%.
This commit is contained in:
parent
55154b6c68
commit
1072d9f15d
Notes:
sideshowbarker
2024-07-17 04:10:16 +09:00
Author: https://github.com/kalenikaliaksandr Commit: https://github.com/SerenityOS/serenity/commit/1072d9f15d Pull-request: https://github.com/SerenityOS/serenity/pull/24084
3 changed files with 13 additions and 5 deletions
|
@ -25,6 +25,11 @@ Cell* CellAllocator::allocate_cell(Heap& heap)
|
|||
|
||||
if (m_usable_blocks.is_empty()) {
|
||||
auto block = HeapBlock::create_with_cell_size(heap, *this, m_cell_size, m_class_name);
|
||||
auto block_ptr = reinterpret_cast<FlatPtr>(block.ptr());
|
||||
if (m_min_block_address > block_ptr)
|
||||
m_min_block_address = block_ptr;
|
||||
if (m_max_block_address < block_ptr)
|
||||
m_max_block_address = block_ptr;
|
||||
m_usable_blocks.append(*block.leak_ptr());
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,8 @@ public:
|
|||
using List = IntrusiveList<&CellAllocator::m_list_node>;
|
||||
|
||||
BlockAllocator& block_allocator() { return m_block_allocator; }
|
||||
FlatPtr min_block_address() const { return m_min_block_address; }
|
||||
FlatPtr max_block_address() const { return m_max_block_address; }
|
||||
|
||||
private:
|
||||
char const* const m_class_name { nullptr };
|
||||
|
@ -61,6 +63,8 @@ private:
|
|||
using BlockList = IntrusiveList<&HeapBlock::m_list_node>;
|
||||
BlockList m_full_blocks;
|
||||
BlockList m_usable_blocks;
|
||||
FlatPtr m_min_block_address { explode_byte(0xff) };
|
||||
FlatPtr m_max_block_address { 0 };
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
|
|
|
@ -112,11 +112,10 @@ void Heap::find_min_and_max_block_addresses(FlatPtr& min_address, FlatPtr& max_a
|
|||
{
|
||||
min_address = explode_byte(0xff);
|
||||
max_address = 0;
|
||||
for_each_block([&](auto& block) {
|
||||
min_address = min(min_address, reinterpret_cast<FlatPtr>(&block));
|
||||
max_address = max(max_address, reinterpret_cast<FlatPtr>(&block) + HeapBlockBase::block_size);
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
for (auto& allocator : m_all_cell_allocators) {
|
||||
min_address = min(min_address, allocator.min_block_address());
|
||||
max_address = max(max_address, allocator.max_block_address() + HeapBlockBase::block_size);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Callback>
|
||||
|
|
Loading…
Add table
Reference in a new issue