mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-07 08:39:22 +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: 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()) {
|
if (m_usable_blocks.is_empty()) {
|
||||||
auto block = HeapBlock::create_with_cell_size(heap, *this, m_cell_size, m_class_name);
|
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());
|
m_usable_blocks.append(*block.leak_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,8 @@ public:
|
||||||
using List = IntrusiveList<&CellAllocator::m_list_node>;
|
using List = IntrusiveList<&CellAllocator::m_list_node>;
|
||||||
|
|
||||||
BlockAllocator& block_allocator() { return m_block_allocator; }
|
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:
|
private:
|
||||||
char const* const m_class_name { nullptr };
|
char const* const m_class_name { nullptr };
|
||||||
|
@ -61,6 +63,8 @@ private:
|
||||||
using BlockList = IntrusiveList<&HeapBlock::m_list_node>;
|
using BlockList = IntrusiveList<&HeapBlock::m_list_node>;
|
||||||
BlockList m_full_blocks;
|
BlockList m_full_blocks;
|
||||||
BlockList m_usable_blocks;
|
BlockList m_usable_blocks;
|
||||||
|
FlatPtr m_min_block_address { explode_byte(0xff) };
|
||||||
|
FlatPtr m_max_block_address { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
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);
|
min_address = explode_byte(0xff);
|
||||||
max_address = 0;
|
max_address = 0;
|
||||||
for_each_block([&](auto& block) {
|
for (auto& allocator : m_all_cell_allocators) {
|
||||||
min_address = min(min_address, reinterpret_cast<FlatPtr>(&block));
|
min_address = min(min_address, allocator.min_block_address());
|
||||||
max_address = max(max_address, reinterpret_cast<FlatPtr>(&block) + HeapBlockBase::block_size);
|
max_address = max(max_address, allocator.max_block_address() + HeapBlockBase::block_size);
|
||||||
return IterationDecision::Continue;
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue