Mercurial > vim
changeset 36065:70bab5acdacf v9.1.0704
patch 9.1.0704: inserting with a count is inefficient
Commit: https://github.com/vim/vim/commit/09b80d23cfae24fa13ef4f52b0ec90625839a6ab
Author: Ken Takata <kentkt@csc.jp>
Date: Sat Aug 31 16:35:06 2024 +0200
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>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 31 Aug 2024 16:45:03 +0200 |
parents | b8d25846181a |
children | 98df9fbe3105 |
files | src/edit.c src/version.c |
diffstat | 2 files changed, 9 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/edit.c +++ b/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;