From ce8ac5975f00d2779f0511ae94b480f9a3761f36 Mon Sep 17 00:00:00 2001 From: Ian Piumarta Date: Tue, 1 Sep 2020 18:10:27 +0900 Subject: [PATCH] Grow maps exponentially instead of linearly --- object.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/object.c b/object.c index a9002d4..5b31491 100644 --- a/object.c +++ b/object.c @@ -373,7 +373,8 @@ oop map_get(oop map, oop key) return get(map, Map, elements)[pos].value; } -#define MAP_CHUNK_SIZE 8 +#define MAP_MIN_SIZE 4 +#define MAP_GROW_SIZE 2 oop map_insert(oop map, oop key, oop value, size_t pos) { @@ -387,7 +388,8 @@ oop map_insert(oop map, oop key, oop value, size_t pos) // check capacity and expand if needed if (map_size(map) >= get(map, Map, capacity)) { - size_t newCapacity = get(map, Map, capacity) + MAP_CHUNK_SIZE; + size_t newCapacity = get(map, Map, capacity) * MAP_GROW_SIZE; + if (newCapacity < MAP_MIN_SIZE) newCapacity= MAP_MIN_SIZE; set(map, Map, elements, realloc(get(map, Map, elements), sizeof(struct Pair) * newCapacity)); set(map, Map, capacity, newCapacity); }