Various performance tuning

This commit is contained in:
Sergiy Kuryata 2025-01-04 16:49:14 -08:00
parent 277abfeb48
commit ad18e02994
12 changed files with 59 additions and 38 deletions

View file

@ -348,8 +348,10 @@ typedef enum mi_option_e {
mi_option_abandoned_reclaim_on_free, // allow to reclaim an abandoned segment on a free (=1)
mi_option_disallow_arena_alloc, // 1 = do not use arena's for allocation (except if using specific arena id's)
mi_option_retry_on_oom, // retry on out-of-memory for N milli seconds (=400), set to 0 to disable retries. (only on windows)
mi_option_max_segments_per_heap, // max number of segments that heap can own
mi_option_heap_collect_abandoned_interval, // interval (in ms) between collecting abandoned segments when a heap drops exessive segments
mi_option_max_segments_per_heap, // max number of segments that heap can own
mi_option_heap_collect_abandoned_interval, // interval (in ms) between collecting abandoned segments when a heap drops excessive segments
mi_option_heap_collect_abandoned_count, // number of abandoned segments to collect when a heap drops excessive segments
mi_option_max_candidate_segments_to_check, // max number of abandoned segments to check before selecting one to reclaim
_mi_option_last,
// legacy option names
mi_option_large_os_pages = mi_option_allow_large_os_pages,

View file

@ -164,6 +164,7 @@ uint8_t* _mi_segment_page_start(const mi_segment_t* segment, const mi_page_t*
void _mi_abandoned_reclaim_all(mi_heap_t* heap, mi_segments_tld_t* tld);
void _mi_abandoned_await_readers(void);
void _mi_abandoned_collect(mi_heap_t* heap, bool force, mi_segments_tld_t* tld);
void _mi_abandoned_collect_clamp(mi_heap_t* heap, bool force, long max_segment_count, mi_segments_tld_t* tld);
bool _mi_segment_attempt_reclaim(mi_heap_t* heap, mi_segment_t* segment);
// "page.c"
@ -602,6 +603,10 @@ static inline mi_page_queue_t* mi_page_queue(const mi_heap_t* heap, size_t size)
return &((mi_heap_t*)heap)->pages[_mi_bin(size)];
}
static inline mi_page_queue_t* mi_queue_of_page(const mi_heap_t* heap, const mi_page_t* page) {
return &((mi_heap_t*)heap)->pages[page->bin_index];
}
//-----------------------------------------------------------

View file

@ -327,6 +327,8 @@ typedef struct mi_page_s {
uint8_t block_size_shift; // if not zero, then `(1 << block_size_shift) == block_size` (only used for fast path in `free.c:_mi_page_ptr_unalign`)
uint8_t heap_tag; // tag of the owning heap, used for separated heaps by object type
// padding
uint8_t bin_index; // bin index of the page queue this page belongs to
size_t free_space_bit; // a bit/mask for marking quickly free_space_mask of the owning segment
size_t block_size; // size available in each block (always `>0`)
uint8_t* page_start; // start of the page area containing the blocks
@ -504,7 +506,6 @@ typedef struct mi_page_queue_s {
mi_page_t* first;
mi_page_t* last;
size_t block_size;
size_t allocationCount;
} mi_page_queue_t;
#define MI_BIN_FULL (MI_BIN_HUGE+1)