mirror of
https://github.com/vim/vim.git
synced 2025-10-23 08:44:20 -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:
committed by
Christian Brabandt
parent
7c8bbc6d28
commit
09b80d23cf
10
src/edit.c
10
src/edit.c
@@ -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;
|
||||
|
||||
@@ -704,6 +704,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
704,
|
||||
/**/
|
||||
703,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user