small speed up by making eh_shift_down iterative
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 26 Nov 2021 16:59:58 +0000 (10:59 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 26 Nov 2021 16:59:58 +0000 (10:59 -0600)
src/entities.c

index f489b356c7a6699fa7b17930f74e4f09739c1a01..3f707abe51a6dc1df84ac9c9c00e6046220ce5b9 100644 (file)
@@ -42,26 +42,31 @@ static void eh_shift_up(EntityHeap* entities, i32 index) {
 }
 
 static void eh_shift_down(EntityHeap* entities, i32 index) {
-    i32 min_index = index;
+    while (1) {
+        i32 min_index = index;
 
-    i32 l = eh_lchild(index);
-    if (l < bh_arr_length(entities->entities)
-        && entity_compare(entities->entities[l], entities->entities[min_index]) < 0) {
-        min_index = l;
-    }
+        i32 l = eh_lchild(index);
+        if (l < bh_arr_length(entities->entities)
+            && entity_compare(entities->entities[l], entities->entities[min_index]) < 0) {
+            min_index = l;
+        }
 
-    i32 r = eh_rchild(index);
-    if (r < bh_arr_length(entities->entities)
-        && entity_compare(entities->entities[r], entities->entities[min_index]) < 0) {
-        min_index = r;
-    }
+        i32 r = eh_rchild(index);
+        if (r < bh_arr_length(entities->entities)
+            && entity_compare(entities->entities[r], entities->entities[min_index]) < 0) {
+            min_index = r;
+        }
 
-    if (index != min_index) {
-        Entity* tmp = entities->entities[min_index];
-        entities->entities[min_index] = entities->entities[index];
-        entities->entities[index] = tmp;
+        if (index != min_index) {
+            Entity* tmp = entities->entities[min_index];
+            entities->entities[min_index] = entities->entities[index];
+            entities->entities[index] = tmp;
+
+            index = min_index;
+            continue;
+        }
 
-        eh_shift_down(entities, min_index);
+        break;
     }
 }