Changeset 9e83b15 for lib/misc.c


Ignore:
Timestamp:
2018-07-03T05:58:47Z (2 years ago)
Author:
dequis <dx@…>
Branches:
master
Children:
c17d0af
Parents:
49ab3cb
git-author:
dequis <dx@…> (03-07-18 05:27:59)
git-committer:
dequis <dx@…> (03-07-18 05:58:47)
Message:

Add a hash table to speed up bee_user_by_handle()

This maintains a hash table next to the linked list, which results in
negligible additional memory usage (~300kb for 10k users) but allows
instant lookups.

This was a big problem with discord, which has huge user lists and joins
everyone to every channel. In my test, the GUILD_SYNC event for 10k-50k
user lists is now approximately 5 times faster.

This hash table based code is only used if handle_cmp is either
exact or case-insensitive string comparison (g_ascii_strcasecmp or
strcmp/g_strcmp0).

The old function that goes through the bee->users linked list is now
called bee_user_by_handle_slow() and used for protocols with unusual
handle_cmp functions - skimming through the code, just oscar.
May revisit this if it happens to more meaningful protocols.

The case-insensitive hashtable functions are copied from irssi, which is
also GPLv2. I renamed them from g_ to b_ (g_istr_equal to b_istr_equal)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/misc.c

    r49ab3cb r9e83b15  
    774774        }
    775775}
     776
     777/* copied from irssi's misc.c, by timo sirainen */
     778int b_istr_equal(gconstpointer v, gconstpointer v2)
     779{
     780        return g_ascii_strcasecmp((const char *) v, (const char *) v2) == 0;
     781}
     782
     783/* copied from irssi's misc.c, by lemonboy */
     784guint b_istr_hash(gconstpointer v)
     785{
     786        const signed char *p;
     787        guint32 h = 5381;
     788
     789        for (p = v; *p != '\0'; p++) {
     790                h = (h << 5) + h + g_ascii_toupper(*p);
     791        }
     792
     793        return h;
     794}
Note: See TracChangeset for help on using the changeset viewer.