Changeset c82e4ca


Ignore:
Timestamp:
2018-07-31T03:40:26Z (6 years ago)
Author:
dx <dx@…>
Branches:
master
Children:
921ea8b, f7cc734
Parents:
5c90890
git-author:
dequis <dx@…> (12-07-18 08:30:59)
git-committer:
dx <dx@…> (31-07-18 03:40:26)
Message:

Use GString for irc->sendbuffer (simpler and faster)

The old code managed growing the buffer manually and called strlen()
very often. GString has a length field and the logic to grow the buffer
is none of our business. Probably smarter, too.

This takes a "blist all" of 14k users from 8.2 to 1.3 seconds.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • bitlbee.c

    r5c90890 rc82e4ca  
    236236        irc_t *irc = data;
    237237        int st, size;
    238         char *temp;
    239 
    240         if (irc->sendbuffer == NULL) {
    241                 return FALSE;
    242         }
    243 
    244         size = strlen(irc->sendbuffer);
    245         st = write(irc->fd, irc->sendbuffer, size);
     238
     239        size = irc->sendbuffer->len;
     240
     241        if (size == 0) {
     242                return FALSE;
     243        }
     244
     245        st = write(irc->fd, irc->sendbuffer->str, size);
    246246
    247247        if (st == 0 || (st < 0 && !sockerr_again())) {
     
    253253
    254254        if (st == size) {
    255                 g_free(irc->sendbuffer);
    256                 irc->sendbuffer = NULL;
     255                g_string_truncate(irc->sendbuffer, 0);
    257256                irc->w_watch_source_id = 0;
    258257
    259258                return FALSE;
    260259        } else {
    261                 temp = g_strdup(irc->sendbuffer + st);
    262                 g_free(irc->sendbuffer);
    263                 irc->sendbuffer = temp;
     260                g_string_erase(irc->sendbuffer, 0, st);
    264261
    265262                return TRUE;
  • irc.c

    r5c90890 rc82e4ca  
    6262        irc->iconv = (GIConv) - 1;
    6363        irc->oconv = (GIConv) - 1;
     64
     65        irc->sendbuffer = g_string_sized_new(IRC_MAX_LINE * 2);
    6466
    6567        if (global.conf->ping_interval > 0 && global.conf->ping_timeout > 0) {
     
    309311        }
    310312
    311         g_free(irc->sendbuffer);
     313        g_string_free(irc->sendbuffer, TRUE);
    312314        g_free(irc->readbuffer);
    313315        g_free(irc->password);
     
    599601
    600602                if (now) {
    601                         g_free(irc->sendbuffer);
    602                         irc->sendbuffer = g_strdup("\r\n");
     603                        g_string_assign(irc->sendbuffer, "\r\n");
    603604                }
    604605                irc_vawrite(temp->data, format, params);
     
    615616void irc_vawrite(irc_t *irc, char *format, va_list params)
    616617{
    617         int size;
    618618        char line[IRC_MAX_LINE + 1];
    619619
     
    642642        g_strlcat(line, "\r\n", IRC_MAX_LINE + 1);
    643643
    644         if (irc->sendbuffer != NULL) {
    645                 gsize line_len = strlen(line);
    646                 gsize buffer_len = strlen(irc->sendbuffer);
    647 
    648                 size = buffer_len + line_len;
    649                 irc->sendbuffer = g_renew(char, irc->sendbuffer, size + 1);
    650                 strcpy((irc->sendbuffer + buffer_len), line);
    651         } else {
    652                 irc->sendbuffer = g_strdup(line);
    653         }
     644        g_string_append(irc->sendbuffer, line);
    654645
    655646        if (irc->w_watch_source_id == 0) {
     
    673664{
    674665        ssize_t n;
    675         size_t len;
    676 
    677         if (irc->sendbuffer == NULL) {
     666        size_t len = irc->sendbuffer->len;
     667
     668        if (len == 0) {
    678669                return;
    679670        }
    680671
    681         len = strlen(irc->sendbuffer);
    682         if ((n = send(irc->fd, irc->sendbuffer, len, 0)) == len) {
    683                 g_free(irc->sendbuffer);
    684                 irc->sendbuffer = NULL;
     672        if ((n = send(irc->fd, irc->sendbuffer->str, len, 0)) == len) {
     673                g_string_truncate(irc->sendbuffer, 0);
    685674
    686675                b_event_remove(irc->w_watch_source_id);
    687676                irc->w_watch_source_id = 0;
    688677        } else if (n > 0) {
    689                 char *s = g_strdup(irc->sendbuffer + n);
    690                 g_free(irc->sendbuffer);
    691                 irc->sendbuffer = s;
     678                g_string_erase(irc->sendbuffer, 0, n);
    692679        }
    693680        /* Otherwise something went wrong and we don't currently care
     
    706693                b_event_remove(irc->w_watch_source_id);
    707694                irc->w_watch_source_id = 0;
    708                 g_free(irc->sendbuffer);
    709                 irc->sendbuffer = NULL;
     695                g_string_truncate(irc->sendbuffer, 0);
    710696        }
    711697
  • irc.h

    r5c90890 rc82e4ca  
    8585        double last_pong;
    8686        int pinging;
    87         char *sendbuffer;
     87        GString *sendbuffer;
    8888        char *readbuffer;
    8989        GIConv iconv, oconv;
  • unix.c

    r5c90890 rc82e4ca  
    373373                sock_make_blocking(irc->fd);
    374374                if (irc->sendbuffer) {
    375                         (void) write(irc->fd, irc->sendbuffer, strlen(irc->sendbuffer));
     375                        (void) write(irc->fd, irc->sendbuffer->str, irc->sendbuffer->len);
    376376                }
    377377                (void) write(irc->fd, message, sizeof(message) - 1);
Note: See TracChangeset for help on using the changeset viewer.