0
0
mirror of https://github.com/vim/vim.git synced 2025-07-24 10:45:12 -04:00

patch 9.1.0704: inserting with a count is inefficient

Problem:  inserting with a count is inefficient
Solution: Disable calculation of the cursor position and topline, if a
          count has been used (Ken Takata)

Optimize insertion when using :normal 10000ix.

This patch optimizes the insertion with a large count (e.g. `:normal
10000ix`).

It seems that calculation of the cursor position for a long line is slow
and it takes O(n^2). Disable the calculation if not needed.

Before:
```
$ time ./vim --clean -c 'normal 10000ix' -cq!
real    0m1.879s
user    0m1.328s
sys     0m0.139s

$ time ./vim --clean -c 'normal 20000ix' -cq!
real    0m5.574s
user    0m5.421s
sys     0m0.093s

$ time ./vim --clean -c 'normal 40000ix' -cq!
real    0m23.588s
user    0m23.187s
sys     0m0.140s
```

After:
```
$ time ./vim --clean -c 'normal 10000ix' -cq!
real    0m0.187s
user    0m0.046s
sys     0m0.093s

$ time ./vim --clean -c 'normal 20000ix' -cq!
real    0m0.217s
user    0m0.046s
sys     0m0.108s

$ time ./vim --clean -c 'normal 40000ix' -cq!
real    0m0.278s
user    0m0.093s
sys     0m0.140s

$ time ./vim --clean -c 'normal 80000ix' -cq!
real    0m0.494s
user    0m0.311s
sys     0m0.140s

$ time ./vim --clean -c 'normal 160000ix' -cq!
real    0m1.302s
user    0m1.140s
sys     0m0.094s
```

closes: #15588

Signed-off-by: K.Takata <kentkt@csc.jp>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Ken Takata 2024-08-31 16:35:06 +02:00 committed by Christian Brabandt
parent 7c8bbc6d28
commit 09b80d23cf
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
2 changed files with 9 additions and 3 deletions

View File

@ -512,6 +512,7 @@ edit(
#ifdef FEAT_DIFF
&& curwin->w_topfill == old_topfill
#endif
&& count <= 1
)
{
mincol = curwin->w_wcol;
@ -549,11 +550,13 @@ edit(
}
// May need to adjust w_topline to show the cursor.
update_topline();
if (count <= 1)
update_topline();
did_backspace = FALSE;
validate_cursor(); // may set must_redraw
if (count <= 1)
validate_cursor(); // may set must_redraw
/*
* Redraw the display when no characters are waiting.
@ -566,7 +569,8 @@ edit(
if (curwin->w_p_crb)
do_check_cursorbind();
update_curswant();
if (count <= 1)
update_curswant();
old_topline = curwin->w_topline;
#ifdef FEAT_DIFF
old_topfill = curwin->w_topfill;

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
704,
/**/
703,
/**/