From 36159288d5ec42c0e883ac619f00e244ef40a58b Mon Sep 17 00:00:00 2001 From: ToyB-Chan Date: Tue, 9 Jun 2026 20:10:45 +0200 Subject: [PATCH] tweaked heuristics --- minimal_heap.h | 4 ++-- minimal_heap_implementation.inl | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/minimal_heap.h b/minimal_heap.h index fcc1ea1..cc77d0a 100644 --- a/minimal_heap.h +++ b/minimal_heap.h @@ -25,8 +25,8 @@ #define MIHP_MIN_TRAVERSELS_BEFORE_EXPANSION 10000 #endif -#ifndef MIHP_MIN_EXPANSION_TRAVERSEL_OCCUPIED_INT_PERCENT - #define MIHP_MIN_EXPANSION_TRAVERSEL_OCCUPIED_INT_PERCENT 50 +#ifndef MIHP_MIN_EXPANSION_TRAVERSEL_RATIO_INT_PERCENT + #define MIHP_MIN_EXPANSION_TRAVERSEL_RATIO_INT_PERCENT 40 #endif #ifndef MIHP_ASSERT diff --git a/minimal_heap_implementation.inl b/minimal_heap_implementation.inl index b108377..6fe763e 100644 --- a/minimal_heap_implementation.inl +++ b/minimal_heap_implementation.inl @@ -81,9 +81,6 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size) MIHP_LOCK_HEAP(&heap->HeapLock); - size_t numTraversedSegments = 0; - - bool triedLastAllocationArea = false; MIHP_HeapMemoryAreaHeader* nextArea = heap->FirstArea; do { @@ -98,14 +95,17 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size) if (currentArea->NumOccupiedSegments == currentArea->NumSegments) continue; + size_t numTraversalsPerArea = MIHP_MAX(100, MIHP_MIN_TRAVERSELS_BEFORE_EXPANSION * currentArea->NumSegments) / heap->Stats.NumTotalSegments; + size_t numTraversedAreaSegments = 0; + MIHP_HeapSegmentHeader* nextSegment = currentArea->FirstSegment; while (nextSegment) { - if (numTraversedSegments > MIHP_MIN_TRAVERSELS_BEFORE_EXPANSION) - if (numTraversedSegments * 100 > heap->Stats.NumTotalOccupiedSegments * MIHP_MIN_EXPANSION_TRAVERSEL_OCCUPIED_INT_PERCENT) - goto AllocateNewArea; + if (numTraversedAreaSegments > numTraversalsPerArea) + if (numTraversedAreaSegments * 100 > currentArea->NumSegments * MIHP_MIN_EXPANSION_TRAVERSEL_RATIO_INT_PERCENT) + break; - numTraversedSegments++; + numTraversedAreaSegments++; MIHP_HeapSegmentHeader* currentSegment = nextSegment; MIHP_ValidateHeapSegmentHeader(heap, currentSegment);