Changeset 5c90890 for root_commands.c


Ignore:
Timestamp:
2018-07-12T08:54:12Z (8 months ago)
Author:
dequis <dx@…>
Branches:
master
Children:
c82e4ca
Parents:
b9d1fdc
git-author:
dequis <dx@…> (03-07-18 06:17:17)
git-committer:
dequis <dx@…> (12-07-18 08:54:12)
Message:

Stop using the irc->users linked list, use the hash table instead

irc_user_new() mentions that the reason this list is kept is for easy
iteration. Luckily, this is the future, and GHashTableIter exists now.

The main point of this is to get rid of the g_slist_insert_sorted() in
irc_user_set_nick() which is a particularly slow part of loading large
user lists, and scales poorly

In a test with discord, the GUILD_SYNC event is now 4 times faster, on
top of the improvements of the other bee_user hash tables patch.
Combining both patches it went from 136 to 6 seconds for 50k members.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • root_commands.c

    rb9d1fdc r5c90890  
    773773        bu->ic->acc->prpl->remove_buddy(bu->ic, bu->handle, NULL);
    774774        nick_del(bu);
    775         if (g_slist_find(irc->users, iu)) {
     775        if (g_hash_table_contains(irc->nick_user_hash, iu->key)) {
    776776                bee_user_free(irc->b, bu);
    777777        }
     
    10331033{
    10341034        int online = 0, away = 0, offline = 0, ismatch = 0;
    1035         GSList *l;
     1035        GList *l, *users;
    10361036        GRegex *regex = NULL;
    10371037        GError *error = NULL;
     
    10741074        }
    10751075
    1076         for (l = irc->users; l; l = l->next) {
     1076        users = g_hash_table_get_values(irc->nick_user_hash);
     1077        users = g_list_sort(users, irc_user_cmp);
     1078
     1079        for (l = users; l; l = l->next) {
    10771080                irc_user_t *iu = l->data;
    10781081                bee_user_t *bu = iu->bu;
     
    11191122                }
    11201123        }
     1124
     1125        g_list_free(users);
    11211126
    11221127        irc_rootmsg(irc, "%d buddies (%d available, %d away, %d offline)", n_online + n_away + n_offline, n_online,
Note: See TracChangeset for help on using the changeset viewer.