cedric pushed a commit to branch master.
commit a11fe38afc1f8459dab600d6659dd5e4a8f734f2
Author: Cedric BAIL <[email protected]>
Date: Thu Apr 4 11:22:43 2013 +0900
eina: remove the most costly boolean ever.
We did use this 'begin' boolean to make eina_hash always allocate only
once per item it push in the hash. This boolean was alone at the end of
a structure. It would have costed us 4bytes on 32bits system and 8bytes
on 64bits. Removing it make elemines consume 100KB less on 32bits system.
We may have a speed impact on hash insertion here, but I don't think we
do use eina_hash_add and friends in any hot path, at the moment. If that
was the case there would be some way to mitigate this, just not worth it
at the moment.
---
src/lib/eina/eina_hash.c | 30 ++++++++++--------------------
1 file changed, 10 insertions(+), 20 deletions(-)
diff --git a/src/lib/eina/eina_hash.c b/src/lib/eina/eina_hash.c
index fc6b7aa..ffe7497 100644
--- a/src/lib/eina/eina_hash.c
+++ b/src/lib/eina/eina_hash.c
@@ -92,16 +92,16 @@ struct _Eina_Hash
struct _Eina_Hash_Head
{
EINA_RBTREE;
- int hash;
Eina_Rbtree *head;
+
+ int hash;
};
struct _Eina_Hash_Element
{
EINA_RBTREE;
Eina_Hash_Tuple tuple;
- Eina_Bool begin : 1;
};
struct _Eina_Hash_Foreach_Data
@@ -246,8 +246,7 @@ eina_hash_add_alloc_by_hash(Eina_Hash *hash,
if (!hash_head)
{
/* If not found allocate it and an element. */
- hash_head = malloc(sizeof(Eina_Hash_Head) + sizeof(Eina_Hash_Element)
- + alloc_length);
+ hash_head = malloc(sizeof(Eina_Hash_Head));
if (!hash_head)
goto on_error;
@@ -260,23 +259,15 @@ eina_hash_add_alloc_by_hash(Eina_Hash *hash,
EINA_RBTREE_CMP_NODE_CB(
_eina_hash_hash_rbtree_cmp_node),
NULL);
-
- new_hash_element = (Eina_Hash_Element *)(hash_head + 1);
- new_hash_element->begin = EINA_TRUE;
}
+ /*
+ Alloc a new element
+ (No more lookup as we expect to support more than one item for one key).
+ */
+ new_hash_element = malloc(sizeof (Eina_Hash_Element) + alloc_length);
if (!new_hash_element)
- {
- /*
- Alloc a new element
- (No more lookup as we expect to support more than one item for one
key).
- */
- new_hash_element = malloc(sizeof (Eina_Hash_Element) + alloc_length);
- if (!new_hash_element)
- goto on_error;
-
- new_hash_element->begin = EINA_FALSE;
- }
+ goto on_error;
/* Setup the element */
new_hash_element->tuple.key_length = key_length;
@@ -403,8 +394,7 @@ _eina_hash_el_free(Eina_Hash_Element *hash_element,
Eina_Hash *hash)
if (hash->data_free_cb)
hash->data_free_cb(hash_element->tuple.data);
- if (hash_element->begin == EINA_FALSE)
- free(hash_element);
+ free(hash_element);
}
static void
--
------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire
the most talented Cisco Certified professionals. Visit the
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html