Changeset 5c90890 for irc_channel.c


Ignore:
Timestamp:
2018-07-12T08:54:12Z (6 years 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
  • irc_channel.c

    rb9d1fdc r5c90890  
    121121{
    122122        irc_t *irc;
    123         GSList *l;
     123        GHashTableIter iter;
     124        gpointer itervalue;
    124125
    125126        if (ic == NULL) {
     
    146147        }
    147148
    148         for (l = irc->users; l; l = l->next) {
    149                 irc_user_t *iu = l->data;
     149        g_hash_table_iter_init(&iter, irc->nick_user_hash);
     150
     151        while (g_hash_table_iter_next(&iter, NULL, &itervalue)) {
     152                irc_user_t *iu = itervalue;
    150153
    151154                if (iu->last_channel == ic) {
     
    729732                }
    730733        } else if (g_strcasecmp(set_getstr(&irc->b->set, "default_target"), "last") == 0 &&
    731                    ic->last_target && g_slist_find(irc->users, ic->last_target)) {
     734                   ic->last_target && g_hash_table_contains(irc->nick_user_hash, ic->last_target->key)) {
    732735                iu = ic->last_target;
    733736        } else {
Note: See TracChangeset for help on using the changeset viewer.