mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 23:39:31 +03:00
merge from dev improved statistics
This commit is contained in:
commit
d5dface6fb
6 changed files with 24 additions and 28 deletions
|
@ -320,7 +320,7 @@ void __mi_stat_counter_increase_mt(mi_stat_counter_t* stat, size_t amount);
|
||||||
#define mi_heap_stat_counter_increase(heap,stat,amount) mi_tld_stat_counter_increase(heap->tld, stat, amount)
|
#define mi_heap_stat_counter_increase(heap,stat,amount) mi_tld_stat_counter_increase(heap->tld, stat, amount)
|
||||||
#define mi_heap_stat_increase(heap,stat,amount) mi_tld_stat_increase( heap->tld, stat, amount)
|
#define mi_heap_stat_increase(heap,stat,amount) mi_tld_stat_increase( heap->tld, stat, amount)
|
||||||
#define mi_heap_stat_decrease(heap,stat,amount) mi_tld_stat_decrease( heap->tld, stat, amount)
|
#define mi_heap_stat_decrease(heap,stat,amount) mi_tld_stat_decrease( heap->tld, stat, amount)
|
||||||
|
#define mi_heap_stat_adjust_decrease(heap,stat,amount) mi_tld_stat_adjust_decrease( heap->tld, stat, amount)
|
||||||
|
|
||||||
/* -----------------------------------------------------------
|
/* -----------------------------------------------------------
|
||||||
Options (exposed for the debugger)
|
Options (exposed for the debugger)
|
||||||
|
|
|
@ -193,10 +193,11 @@ static void* mi_heap_malloc_zero_aligned_at(mi_heap_t* const heap, const size_t
|
||||||
const bool is_aligned = (((uintptr_t)page->free + offset) & align_mask)==0;
|
const bool is_aligned = (((uintptr_t)page->free + offset) & align_mask)==0;
|
||||||
if mi_likely(is_aligned)
|
if mi_likely(is_aligned)
|
||||||
{
|
{
|
||||||
|
void* p = (zero ? _mi_page_malloc_zeroed(heap,page,padsize) : _mi_page_malloc(heap,page,padsize)); // call specific page malloc for better codegen
|
||||||
#if MI_STAT>1
|
#if MI_STAT>1
|
||||||
|
mi_heap_stat_adjust_decrease(heap, malloc_requested, padsize);
|
||||||
mi_heap_stat_increase(heap, malloc_requested, size);
|
mi_heap_stat_increase(heap, malloc_requested, size);
|
||||||
#endif
|
#endif
|
||||||
void* p = (zero ? _mi_page_malloc_zeroed(heap,page,padsize) : _mi_page_malloc(heap,page,padsize)); // call specific page malloc for better codegen
|
|
||||||
mi_assert_internal(p != NULL);
|
mi_assert_internal(p != NULL);
|
||||||
mi_assert_internal(((uintptr_t)p + offset) % alignment == 0);
|
mi_assert_internal(((uintptr_t)p + offset) % alignment == 0);
|
||||||
mi_track_malloc(p,size,zero);
|
mi_track_malloc(p,size,zero);
|
||||||
|
|
16
src/alloc.c
16
src/alloc.c
|
@ -92,6 +92,7 @@ extern inline void* _mi_page_malloc_zero(mi_heap_t* heap, mi_page_t* page, size_
|
||||||
#if (MI_STAT>1)
|
#if (MI_STAT>1)
|
||||||
const size_t bin = _mi_bin(bsize);
|
const size_t bin = _mi_bin(bsize);
|
||||||
mi_heap_stat_increase(heap, malloc_bins[bin], 1);
|
mi_heap_stat_increase(heap, malloc_bins[bin], 1);
|
||||||
|
mi_heap_stat_increase(heap, malloc_requested, size - MI_PADDING_SIZE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -150,12 +151,6 @@ static inline mi_decl_restrict void* mi_heap_malloc_small_zero(mi_heap_t* heap,
|
||||||
void* const p = _mi_page_malloc_zero(heap, page, size + MI_PADDING_SIZE, zero);
|
void* const p = _mi_page_malloc_zero(heap, page, size + MI_PADDING_SIZE, zero);
|
||||||
mi_track_malloc(p,size,zero);
|
mi_track_malloc(p,size,zero);
|
||||||
|
|
||||||
#if MI_STAT>1
|
|
||||||
if (p != NULL) {
|
|
||||||
if (!mi_heap_is_initialized(heap)) { heap = mi_prim_get_default_heap(); }
|
|
||||||
mi_heap_stat_increase(heap, malloc_requested, mi_usable_size(p));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if MI_DEBUG>3
|
#if MI_DEBUG>3
|
||||||
if (p != NULL && zero) {
|
if (p != NULL && zero) {
|
||||||
mi_assert_expensive(mi_mem_is_zero(p, size));
|
mi_assert_expensive(mi_mem_is_zero(p, size));
|
||||||
|
@ -192,12 +187,6 @@ extern inline void* _mi_heap_malloc_zero_ex(mi_heap_t* heap, size_t size, bool z
|
||||||
void* const p = _mi_malloc_generic(heap, size + MI_PADDING_SIZE, zero, huge_alignment); // note: size can overflow but it is detected in malloc_generic
|
void* const p = _mi_malloc_generic(heap, size + MI_PADDING_SIZE, zero, huge_alignment); // note: size can overflow but it is detected in malloc_generic
|
||||||
mi_track_malloc(p,size,zero);
|
mi_track_malloc(p,size,zero);
|
||||||
|
|
||||||
#if MI_STAT>1
|
|
||||||
if (p != NULL) {
|
|
||||||
if (!mi_heap_is_initialized(heap)) { heap = mi_prim_get_default_heap(); }
|
|
||||||
mi_heap_stat_increase(heap, malloc_requested, mi_usable_size(p));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if MI_DEBUG>3
|
#if MI_DEBUG>3
|
||||||
if (p != NULL && zero) {
|
if (p != NULL && zero) {
|
||||||
mi_assert_expensive(mi_mem_is_zero(p, size));
|
mi_assert_expensive(mi_mem_is_zero(p, size));
|
||||||
|
@ -672,7 +661,8 @@ mi_decl_restrict void* _mi_heap_malloc_guarded(mi_heap_t* heap, size_t size, boo
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
if (!mi_heap_is_initialized(heap)) { heap = mi_prim_get_default_heap(); }
|
if (!mi_heap_is_initialized(heap)) { heap = mi_prim_get_default_heap(); }
|
||||||
#if MI_STAT>1
|
#if MI_STAT>1
|
||||||
mi_heap_stat_increase(heap, malloc_requested, mi_usable_size(p));
|
mi_heap_stat_adjust_decrease(heap, malloc_requested, req_size);
|
||||||
|
mi_heap_stat_increase(heap, malloc_requested, size);
|
||||||
#endif
|
#endif
|
||||||
mi_heap_stat_counter_increase(heap, malloc_guarded_count, 1);
|
mi_heap_stat_counter_increase(heap, malloc_guarded_count, 1);
|
||||||
}
|
}
|
||||||
|
|
12
src/free.c
12
src/free.c
|
@ -532,16 +532,14 @@ static void mi_check_padding(const mi_page_t* page, const mi_block_t* block) {
|
||||||
|
|
||||||
// only maintain stats for smaller objects if requested
|
// only maintain stats for smaller objects if requested
|
||||||
#if (MI_STAT>0)
|
#if (MI_STAT>0)
|
||||||
void mi_stat_free(const mi_page_t* page, const mi_block_t* block) {
|
static void mi_stat_free(const mi_page_t* page, const mi_block_t* block) {
|
||||||
#if (MI_STAT < 2)
|
|
||||||
MI_UNUSED(block);
|
MI_UNUSED(block);
|
||||||
#endif
|
|
||||||
mi_heap_t* const heap = mi_heap_get_default();
|
mi_heap_t* const heap = mi_heap_get_default();
|
||||||
const size_t bsize = mi_page_usable_block_size(page);
|
const size_t bsize = mi_page_usable_block_size(page);
|
||||||
#if (MI_STAT>1)
|
// #if (MI_STAT>1)
|
||||||
const size_t usize = mi_page_usable_size_of(page, block);
|
// const size_t usize = mi_page_usable_size_of(page, block);
|
||||||
mi_heap_stat_decrease(heap, malloc_requested, usize);
|
// mi_heap_stat_decrease(heap, malloc_requested, usize);
|
||||||
#endif
|
// #endif
|
||||||
if (bsize <= MI_LARGE_MAX_OBJ_SIZE) {
|
if (bsize <= MI_LARGE_MAX_OBJ_SIZE) {
|
||||||
mi_heap_stat_decrease(heap, malloc_normal, bsize);
|
mi_heap_stat_decrease(heap, malloc_normal, bsize);
|
||||||
#if (MI_STAT > 1)
|
#if (MI_STAT > 1)
|
||||||
|
|
|
@ -342,7 +342,7 @@ static bool _mi_heap_page_destroy(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_
|
||||||
if (bsize > MI_LARGE_MAX_OBJ_SIZE) {
|
if (bsize > MI_LARGE_MAX_OBJ_SIZE) {
|
||||||
mi_heap_stat_decrease(heap, malloc_huge, bsize);
|
mi_heap_stat_decrease(heap, malloc_huge, bsize);
|
||||||
}
|
}
|
||||||
#if (MI_STAT)
|
#if (MI_STAT>0)
|
||||||
_mi_page_free_collect(page, false); // update used count
|
_mi_page_free_collect(page, false); // update used count
|
||||||
const size_t inuse = page->used;
|
const size_t inuse = page->used;
|
||||||
if (bsize <= MI_LARGE_MAX_OBJ_SIZE) {
|
if (bsize <= MI_LARGE_MAX_OBJ_SIZE) {
|
||||||
|
@ -351,7 +351,7 @@ static bool _mi_heap_page_destroy(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_
|
||||||
mi_heap_stat_decrease(heap, malloc_bins[_mi_bin(bsize)], inuse);
|
mi_heap_stat_decrease(heap, malloc_bins[_mi_bin(bsize)], inuse);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
mi_heap_stat_decrease(heap, malloc_requested, bsize * inuse); // todo: off for aligned blocks...
|
// mi_heap_stat_decrease(heap, malloc_requested, bsize * inuse); // todo: off for aligned blocks...
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// pretend it is all free now
|
/// pretend it is all free now
|
||||||
|
|
15
src/stats.c
15
src/stats.c
|
@ -227,6 +227,13 @@ static void mi_stat_peak_print(const mi_stat_count_t* stat, const char* msg, int
|
||||||
_mi_fprintf(out, arg, "\n");
|
_mi_fprintf(out, arg, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mi_stat_total_print(const mi_stat_count_t* stat, const char* msg, int64_t unit, mi_output_fun* out, void* arg) {
|
||||||
|
_mi_fprintf(out, arg, "%10s:", msg);
|
||||||
|
_mi_fprintf(out, arg, "%12s", " "); // no peak
|
||||||
|
mi_print_amount(stat->total, unit, out, arg);
|
||||||
|
_mi_fprintf(out, arg, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
static void mi_stat_counter_print(const mi_stat_counter_t* stat, const char* msg, mi_output_fun* out, void* arg ) {
|
static void mi_stat_counter_print(const mi_stat_counter_t* stat, const char* msg, mi_output_fun* out, void* arg ) {
|
||||||
_mi_fprintf(out, arg, "%10s:", msg);
|
_mi_fprintf(out, arg, "%10s:", msg);
|
||||||
mi_print_amount(stat->total, -1, out, arg);
|
mi_print_amount(stat->total, -1, out, arg);
|
||||||
|
@ -243,7 +250,7 @@ static void mi_stat_counter_print_avg(const mi_stat_counter_t* stat, const char*
|
||||||
|
|
||||||
|
|
||||||
static void mi_print_header(mi_output_fun* out, void* arg ) {
|
static void mi_print_header(mi_output_fun* out, void* arg ) {
|
||||||
_mi_fprintf(out, arg, "%10s: %11s %11s %11s %11s %11s\n", "heap stats", "peak ", "total ", "current ", "unit ", "total# ");
|
_mi_fprintf(out, arg, "%10s: %11s %11s %11s %11s %11s\n", "heap stats", "peak ", "total ", "current ", "block ", "total# ");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MI_STAT>1
|
#if MI_STAT>1
|
||||||
|
@ -312,10 +319,10 @@ static void _mi_stats_print(mi_stats_t* stats, mi_output_fun* out0, void* arg0)
|
||||||
// and print using that
|
// and print using that
|
||||||
mi_print_header(out,arg);
|
mi_print_header(out,arg);
|
||||||
#if MI_STAT>1
|
#if MI_STAT>1
|
||||||
mi_stats_print_bins(stats->malloc_bins, MI_BIN_HUGE, "normal",out,arg);
|
mi_stats_print_bins(stats->malloc_bins, MI_BIN_HUGE, "bin",out,arg);
|
||||||
#endif
|
#endif
|
||||||
#if MI_STAT
|
#if MI_STAT
|
||||||
mi_stat_print(&stats->malloc_normal, "normal", (stats->malloc_normal_count.total == 0 ? 1 : -1), out, arg);
|
mi_stat_print(&stats->malloc_normal, "binned", (stats->malloc_normal_count.total == 0 ? 1 : -1), out, arg);
|
||||||
mi_stat_print(&stats->malloc_huge, "huge", (stats->malloc_huge_count.total == 0 ? 1 : -1), out, arg);
|
mi_stat_print(&stats->malloc_huge, "huge", (stats->malloc_huge_count.total == 0 ? 1 : -1), out, arg);
|
||||||
mi_stat_count_t total = { 0,0,0 };
|
mi_stat_count_t total = { 0,0,0 };
|
||||||
mi_stat_count_add_mt(&total, &stats->malloc_normal);
|
mi_stat_count_add_mt(&total, &stats->malloc_normal);
|
||||||
|
@ -323,7 +330,7 @@ static void _mi_stats_print(mi_stats_t* stats, mi_output_fun* out0, void* arg0)
|
||||||
mi_stat_print_ex(&total, "total", 1, out, arg, "");
|
mi_stat_print_ex(&total, "total", 1, out, arg, "");
|
||||||
#endif
|
#endif
|
||||||
#if MI_STAT>1
|
#if MI_STAT>1
|
||||||
mi_stat_print_ex(&stats->malloc_requested, "malloc req", 1, out, arg, "");
|
mi_stat_total_print(&stats->malloc_requested, "malloc req", 1, out, arg);
|
||||||
_mi_fprintf(out, arg, "\n");
|
_mi_fprintf(out, arg, "\n");
|
||||||
#endif
|
#endif
|
||||||
mi_stat_print_ex(&stats->reserved, "reserved", 1, out, arg, "");
|
mi_stat_print_ex(&stats->reserved, "reserved", 1, out, arg, "");
|
||||||
|
|
Loading…
Add table
Reference in a new issue