Mercurial > vim
changeset 11331:ff27a6a3a243 v8.0.0551
patch 8.0.0551: the typeahead buffer is reallocated too often
commit https://github.com/vim/vim/commit/d34f9b1155a6b470e1dc766ff98192f440e7eba7
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Apr 8 18:41:13 2017 +0200
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 08 Apr 2017 18:45:03 +0200 |
parents | 27e189283e90 |
children | 32117645280c |
files | src/getchar.c src/version.c |
diffstat | 2 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;