Reduce number of reallocs in small array

This commit is contained in:
Warwick 2024-12-18 17:34:10 +00:00
parent db37ccedb3
commit 902fc9cbba
2 changed files with 9 additions and 5 deletions

View file

@ -37,10 +37,14 @@ void *dyna_ensure_capacity(void *array, int64_t item_count) {
} }
size_t new_capacity = minimum_capacity * ARRAY_GROWTH_MULTIPLIER; size_t new_capacity = minimum_capacity * ARRAY_GROWTH_MULTIPLIER;
// Force minimum automatic reallocation
if (new_capacity <= ARRAY_INITIAL_CAPACITY) {
new_capacity = ARRAY_INITIAL_CAPACITY;
}
// Return if the array is valid and so small it's not worth reallocating // If we're at minimum auto capacity and the capacity is fine don't realloc
if (header->capacity > minimum_capacity && if (new_capacity <= ARRAY_INITIAL_CAPACITY &&
new_capacity <= ARRAY_INITIAL_CAPACITY) { header->capacity >= minimum_capacity) {
return header + 1; return header + 1;
} }

View file

@ -6,13 +6,13 @@
int main() { int main() {
uint64_t *dyna_array = dyna_init(uint64_t); uint64_t *dyna_array = dyna_init(uint64_t);
for (uint64_t i = 0; i < 100; i++) { for (uint64_t i = 0; i < 1000; i++) {
dyna_append(dyna_array, i); dyna_append(dyna_array, i);
printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array), printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array),
dyna_capacity(dyna_array), dyna_array[i - 1]); dyna_capacity(dyna_array), dyna_array[i - 1]);
} }
for (uint64_t i = 100; i > 0; i--) { for (uint64_t i = 1000; i > 0; i--) {
printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array), printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array),
dyna_capacity(dyna_array), dyna_array[i - 1]); dyna_capacity(dyna_array), dyna_array[i - 1]);
dyna_pop(dyna_array); dyna_pop(dyna_array);