mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 23:19:31 +03:00
improve page_free_extend performance slightly; do not maintain expensive statistics in release mode
This commit is contained in:
parent
47fc73d694
commit
89858ab791
2 changed files with 13 additions and 11 deletions
14
src/page.c
14
src/page.c
|
@ -410,7 +410,7 @@ void _mi_page_retire(mi_page_t* page) {
|
||||||
// if its neighbours are almost fully used.
|
// if its neighbours are almost fully used.
|
||||||
if (mi_likely(page->block_size <= (MI_SMALL_SIZE_MAX/4))) {
|
if (mi_likely(page->block_size <= (MI_SMALL_SIZE_MAX/4))) {
|
||||||
if (mi_page_mostly_used(page->prev) && mi_page_mostly_used(page->next)) {
|
if (mi_page_mostly_used(page->prev) && mi_page_mostly_used(page->next)) {
|
||||||
_mi_stat_counter_increase(&_mi_stats_main.page_no_retire,1);
|
mi_stat_counter_increase(_mi_stats_main.page_no_retire,1);
|
||||||
return; // dont't retire after all
|
return; // dont't retire after all
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -482,7 +482,7 @@ static void mi_page_free_list_extend_secure(mi_heap_t* heap, mi_page_t* page, si
|
||||||
heap->random = _mi_random_shuffle(rnd);
|
heap->random = _mi_random_shuffle(rnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mi_page_free_list_extend( mi_page_t* page, size_t extend, mi_stats_t* stats)
|
static mi_decl_noinline void mi_page_free_list_extend( mi_page_t* page, size_t extend, mi_stats_t* stats)
|
||||||
{
|
{
|
||||||
UNUSED(stats);
|
UNUSED(stats);
|
||||||
mi_assert_internal(page->free == NULL);
|
mi_assert_internal(page->free == NULL);
|
||||||
|
@ -530,11 +530,11 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page, mi_stats_t* st
|
||||||
|
|
||||||
size_t page_size;
|
size_t page_size;
|
||||||
_mi_page_start(_mi_page_segment(page), page, &page_size);
|
_mi_page_start(_mi_page_segment(page), page, &page_size);
|
||||||
_mi_stat_increase(&stats->pages_extended, 1);
|
mi_stat_increase(stats->pages_extended, 1);
|
||||||
|
|
||||||
// calculate the extend count
|
// calculate the extend count
|
||||||
size_t extend = page->reserved - page->capacity;
|
size_t extend = page->reserved - page->capacity;
|
||||||
size_t max_extend = MI_MAX_EXTEND_SIZE/page->block_size;
|
size_t max_extend = (page->block_size >= MI_MAX_EXTEND_SIZE ? MI_MIN_EXTEND : MI_MAX_EXTEND_SIZE/(uint32_t)page->block_size);
|
||||||
if (max_extend < MI_MIN_EXTEND) max_extend = MI_MIN_EXTEND;
|
if (max_extend < MI_MIN_EXTEND) max_extend = MI_MIN_EXTEND;
|
||||||
|
|
||||||
if (extend > max_extend) {
|
if (extend > max_extend) {
|
||||||
|
@ -547,7 +547,7 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page, mi_stats_t* st
|
||||||
mi_assert_internal(extend < (1UL<<16));
|
mi_assert_internal(extend < (1UL<<16));
|
||||||
|
|
||||||
// and append the extend the free list
|
// and append the extend the free list
|
||||||
if (extend < MI_MIN_SLICES || !mi_option_is_enabled(mi_option_secure)) {
|
if (extend < MI_MIN_SLICES || MI_SECURE==0) { //!mi_option_is_enabled(mi_option_secure)) {
|
||||||
mi_page_free_list_extend(page, extend, stats );
|
mi_page_free_list_extend(page, extend, stats );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -555,7 +555,7 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page, mi_stats_t* st
|
||||||
}
|
}
|
||||||
// enable the new free list
|
// enable the new free list
|
||||||
page->capacity += (uint16_t)extend;
|
page->capacity += (uint16_t)extend;
|
||||||
_mi_stat_increase(&stats->page_committed, extend * page->block_size);
|
mi_stat_increase(stats->page_committed, extend * page->block_size);
|
||||||
|
|
||||||
// extension into zero initialized memory preserves the zero'd free list
|
// extension into zero initialized memory preserves the zero'd free list
|
||||||
if (!page->is_zero_init) {
|
if (!page->is_zero_init) {
|
||||||
|
@ -653,7 +653,7 @@ static mi_page_t* mi_page_queue_find_free_ex(mi_heap_t* heap, mi_page_queue_t* p
|
||||||
page = next;
|
page = next;
|
||||||
} // for each page
|
} // for each page
|
||||||
|
|
||||||
_mi_stat_counter_increase(&heap->tld->stats.searches,count);
|
mi_stat_counter_increase(heap->tld->stats.searches,count);
|
||||||
|
|
||||||
if (page == NULL) {
|
if (page == NULL) {
|
||||||
page = rpage;
|
page = rpage;
|
||||||
|
|
|
@ -18,7 +18,7 @@ terms of the MIT license.
|
||||||
|
|
||||||
// argument defaults
|
// argument defaults
|
||||||
static int THREADS = 32; // more repeatable if THREADS <= #processors
|
static int THREADS = 32; // more repeatable if THREADS <= #processors
|
||||||
static int N = 10; // scaling factor
|
static int N = 20; // scaling factor
|
||||||
|
|
||||||
// static int THREADS = 8; // more repeatable if THREADS <= #processors
|
// static int THREADS = 8; // more repeatable if THREADS <= #processors
|
||||||
// static int N = 100; // scaling factor
|
// static int N = 100; // scaling factor
|
||||||
|
@ -163,8 +163,10 @@ int main(int argc, char** argv) {
|
||||||
for (int i = 0; i < TRANSFERS; i++) {
|
for (int i = 0; i < TRANSFERS; i++) {
|
||||||
free_items((void*)transfer[i]);
|
free_items((void*)transfer[i]);
|
||||||
}
|
}
|
||||||
|
#ifndef NDEBUG
|
||||||
mi_collect(false);
|
mi_collect(false);
|
||||||
mi_collect(true);
|
mi_collect(true);
|
||||||
|
#endif
|
||||||
mi_stats_print(NULL);
|
mi_stats_print(NULL);
|
||||||
//bench_end_program();
|
//bench_end_program();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue