static void do_tallocs(struct node *node)
{
unsigned int i;
-
- node->n = talloc_size(node->parent ? node->parent->n : NULL, node->len);
+ static int count;
+
+ if (count++ % 16 == 0)
+ node->n = talloc_array(node->parent ? node->parent->n : NULL,
+ char, node->len);
+ else
+ node->n = talloc_size(node->parent ? node->parent->n : NULL,
+ node->len);
if (node->destructor)
talloc_set_destructor(node->n, unused_talloc_destructor);
if (node->name)
static void do_tals(struct node *node)
{
unsigned int i;
+ static int count;
+
+ /* Tal pays a penalty for arrays, but we can't tell which is an array
+ * and which isn't. Grepping samba source gives 1221 talloc_array of
+ * 33137 talloc occurrences, so conservatively assume 1 in 16 */
+ if (count++ % 16 == 0)
+ node->n = tal_arr(node->parent ? node->parent->n : NULL,
+ char, node->len);
+ else
+ node->n = tal_alloc_(node->parent ? node->parent->n : NULL,
+ node->len, false, TAL_LABEL(type, ""));
- node->n = tal_arr(node->parent ? node->parent->n : NULL,
- char, node->len);
if (node->destructor)
tal_add_destructor(node->n, unused_tal_destructor);
if (node->name)
printf("Tal time: %lluns\n", time_to_nsec(alloc_time));
printf("Tal_free time: %lluns\n", time_to_nsec(free_time));
-after_tal:
free_time.tv_sec = free_time.tv_nsec = 0;
for (i = 0; i < LOOPS; i++) {
do_tals(root);
}
free_time = time_divide(free_time, i);
printf("Single tal_free time: %lluns\n", time_to_nsec(free_time));
+after_tal:
return 0;
}