Remove unecessary alloc from hyper c array.
The last commit allocated an array for pointers to the hyper c array
structure. This is not necessary for improved performance. This change
still leaves the union time at 0.01 to 0.02 ms.
diff --git a/c_src/hyper_carray.c b/c_src/hyper_carray.c
index 7eedc85..e54abfb 100644
--- a/c_src/hyper_carray.c
+++ b/c_src/hyper_carray.c
@@ -154,52 +154,38 @@
carray_ptr first = NULL;
HYPER_CARRAY_OR_BADARG(head, first);
+ const unsigned int nitems = first->size;
carray_ptr acc = NULL;
carray_alloc(first->precision, &acc);
memcpy(acc->items, first->items, acc->size);
- carray_ptr *arrays =
- (carray_ptr *) enif_alloc(narrays * sizeof(carray_ptr));
- arrays[0] = first;
-
- // Validate arrays
+ // Merge arrays
for (int i = 1; i < narrays; ++i) {
- void *tmp = NULL;
+ carray_ptr curr = NULL;
if (!enif_get_list_cell(env, tail, &head, &tail)
|| !enif_get_resource(env, head, carray_resource,
- &tmp))
+ (void *)&curr))
goto dealloc_and_badarg;
- arrays[i] = tmp;
-
// Require uniform precision.
- if (arrays[i]->precision != acc->precision)
+ if (curr->precision != acc->precision)
goto dealloc_and_badarg;
- continue;
-
- dealloc_and_badarg:
- enif_free((void *) arrays);
- dtor(env, acc);
- return enif_make_badarg(env);
- }
-
- // Merge arrays
- const unsigned int nitems = first->size;
- for (carray_ptr * it = arrays + 1, *end = arrays + narrays;
- it != end; ++it) {
- carray_ptr curr = *it;
-
for (uint8_t * accitem = acc->items, *item = curr->items,
*enditem = curr->items + nitems;
item != enditem; ++item, ++accitem) {
*accitem = (*item > *accitem) ? *item : *accitem;
}
+
+ continue;
+
+ dealloc_and_badarg:
+ dtor(env, acc);
+ return enif_make_badarg(env);
}
- enif_free((void *) arrays);
return enif_make_resource(env, acc);
}