From e3359f8349cf972052604c089b5bab71f5e33095 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 24 Sep 2019 20:44:58 +0000 Subject: [PATCH] Some minor performance improvements - most notably, don't search the input state table if the next character matches the same state as before. --- grid.c | 22 ++++++++++++---------- input.c | 27 +++++++++++++++++---------- log.c | 3 +++ screen-write.c | 6 ++---- 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/grid.c b/grid.c index 2f1e9b59..a016dc12 100644 --- a/grid.c +++ b/grid.c @@ -186,17 +186,19 @@ grid_clear_cell(struct grid *gd, u_int px, u_int py, u_int bg) struct grid_cell *gc; memcpy(gce, &grid_cleared_entry, sizeof *gce); - if (bg & COLOUR_FLAG_RGB) { - grid_get_extended_cell(gl, gce, gce->flags); - gl->flags |= GRID_LINE_EXTENDED; + if (bg != 8) { + if (bg & COLOUR_FLAG_RGB) { + grid_get_extended_cell(gl, gce, gce->flags); + gl->flags |= GRID_LINE_EXTENDED; - gc = &gl->extddata[gce->offset]; - memcpy(gc, &grid_cleared_cell, sizeof *gc); - gc->bg = bg; - } else { - if (bg & COLOUR_FLAG_256) - gce->flags |= GRID_FLAG_BG256; - gce->data.bg = bg; + gc = &gl->extddata[gce->offset]; + memcpy(gc, &grid_cleared_cell, sizeof *gc); + gc->bg = bg; + } else { + if (bg & COLOUR_FLAG_256) + gce->flags |= GRID_FLAG_BG256; + gce->data.bg = bg; + } } } diff --git a/input.c b/input.c index f37f8fd8..2ff7a65d 100644 --- a/input.c +++ b/input.c @@ -888,7 +888,8 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len) { struct input_ctx *ictx = wp->ictx; struct screen_write_ctx *sctx = &ictx->ctx; - const struct input_transition *itr; + const struct input_state *state = NULL; + const struct input_transition *itr = NULL; size_t off = 0; if (len == 0) @@ -916,16 +917,22 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len) ictx->ch = buf[off++]; /* Find the transition. */ - itr = ictx->state->transitions; - while (itr->first != -1 && itr->last != -1) { - if (ictx->ch >= itr->first && ictx->ch <= itr->last) - break; - itr++; - } - if (itr->first == -1 || itr->last == -1) { - /* No transition? Eh? */ - fatalx("no transition from state"); + if (ictx->state != state || + itr == NULL || + ictx->ch < itr->first || + ictx->ch > itr->last) { + itr = ictx->state->transitions; + while (itr->first != -1 && itr->last != -1) { + if (ictx->ch >= itr->first && ictx->ch <= itr->last) + break; + itr++; + } + if (itr->first == -1 || itr->last == -1) { + /* No transition? Eh? */ + fatalx("no transition from state"); + } } + state = ictx->state; /* * Any state except print stops the current collection. This is diff --git a/log.c b/log.c index c002663e..44b24c67 100644 --- a/log.c +++ b/log.c @@ -131,6 +131,9 @@ log_debug(const char *msg, ...) { va_list ap; + if (log_file == NULL) + return; + va_start(ap, msg); log_vwrite(msg, ap); va_end(ap); diff --git a/screen-write.c b/screen-write.c index 6c509e2c..34d16ee8 100644 --- a/screen-write.c +++ b/screen-write.c @@ -1326,8 +1326,7 @@ screen_write_collect_end(struct screen_write_ctx *ctx) } } - memcpy(&gc, &ci->gc, sizeof gc); - grid_view_set_cells(s->grid, s->cx, s->cy, &gc, ci->data, ci->used); + grid_view_set_cells(s->grid, s->cx, s->cy, &ci->gc, ci->data, ci->used); screen_write_set_cursor(ctx, s->cx + ci->used, -1); for (xx = s->cx; xx < screen_size_x(s); xx++) { @@ -1351,8 +1350,7 @@ screen_write_collect_add(struct screen_write_ctx *ctx, /* * Don't need to check that the attributes and whatnot are still the * same - input_parse will end the collection when anything that isn't - * a plain character is encountered. Also nothing should make it here - * that isn't a single ASCII character. + * a plain character is encountered. */ collect = 1;