From d34f9b1155a6b470e1dc766ff98192f440e7eba7 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 8 Apr 2017 18:41:13 +0200 Subject: patch 8.0.0551: the typeahead buffer is reallocated too often Problem: The typeahead buffer is reallocated too often. Solution: Re-use the existing buffer if possible. --- src/getchar.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'src/getchar.c') diff --git a/src/getchar.c b/src/getchar.c index c057861a61..18af2a3740 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -920,7 +920,7 @@ init_typebuf(void) typebuf.tb_noremap = noremapbuf_init; typebuf.tb_buflen = TYPELEN_INIT; typebuf.tb_len = 0; - typebuf.tb_off = 0; + typebuf.tb_off = MAXMAPLEN + 4; typebuf.tb_change_cnt = 1; } } @@ -974,11 +974,21 @@ ins_typebuf( typebuf.tb_off -= addlen; mch_memmove(typebuf.tb_buf + typebuf.tb_off, str, (size_t)addlen); } + else if (typebuf.tb_len == 0 && typebuf.tb_buflen + >= addlen + 3 * (MAXMAPLEN + 4)) + { + /* + * Buffer is empty and string fits in the existing buffer. + * Leave some space before and after, if possible. + */ + typebuf.tb_off = (typebuf.tb_buflen - addlen - 3 * (MAXMAPLEN + 4)) / 2; + mch_memmove(typebuf.tb_buf + typebuf.tb_off, str, (size_t)addlen); + } else { /* * Need to allocate a new buffer. - * In typebuf.tb_buf there must always be room for 3 * MAXMAPLEN + 4 + * In typebuf.tb_buf there must always be room for 3 * (MAXMAPLEN + 4) * characters. We add some extra room to avoid having to allocate too * often. */ @@ -1291,7 +1301,7 @@ alloc_typebuf(void) return FAIL; } typebuf.tb_buflen = TYPELEN_INIT; - typebuf.tb_off = 0; + typebuf.tb_off = MAXMAPLEN + 4; /* can insert without realloc */ typebuf.tb_len = 0; typebuf.tb_maplen = 0; typebuf.tb_silent = 0; -- cgit v1.2.3