Tuesday, December 25, 2012

Re: Fold expression called too often

Christian Brabandt wrote:

> On So, 23 Dez 2012, Marco wrote:
>
> > I tried to create a custom fold expression for a file type. The
> > folding works as desired, but it makes vim terribly slow. Commands
> > like "gwip" to format the current paragraph take more than ten
> > seconds on a modern machine. Thanks to Drew [1] I heard about the
> > possibility to profile my expression and was surprised that it was
> > called millions of times for a file containing just a few dozen
> > lines.
> >
> > I created a simple test expression and it is also called way more
> > often than I would expect. Here my test case:
> >
> > " file: test
> > Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
> > tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
> > vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
> > no sea takimata sanctus est Lorem ipsum dolor sit amet.
> > " endfile
> >
> > " file: myfold.vim
> > function! MyFolds()
> > let thisline = getline(v:lnum)
> >
> > if match(thisline, 'start') >= 0
> > return "a1"
> > elseif match(thisline, 'stop') >= 0
> > return "s1"
> > else
> > return "="
> > endfunction
> >
> > setlocal foldmethod=expr
> > setlocal foldexpr=MyFolds()
> >
> > function! TextManip()
> > normal gwip
> > endfunction
> >
> > call TextManip()
> > " endfile
> >
> > This is how I did the profiling:
> >
> > vim --cmd 'profile start profile.result' \
> > --cmd 'profile! file myfold.vim' \
> > -c 'source myfold.vim' \
> > -c 'profdel file myfold.vim' \
> > test
> >
> > The resulting file profile.result shows that the function MyFolds()
> > was called 52 times:
> >
> > FUNCTIONS SORTED ON TOTAL TIME
> > count total (s) self (s) function
> > 1 0.000961 0.000252 TextManip()
> > 52 0.000709 MyFolds()
> >
> > The test file contains just four lines. Why is it called 52 times?
> > And what can I do about that?
>
> Bram,
> foldupdate will be called several times, when formating a paragraph,
> because it can be called in del_bytes() function and also in do_join()
> function. I wonder, if we can defer the foldupdate until after
> formatting has taken place, e.g. something like this patch, which seems
> to work so far, but the foldexpression is called not so often.

When making changes to foldupdate, please test this in various
circumstances. In the past quite a few bugs were fixed because folds
were not updated properly. I'm not sure postponing the update works
properly.

--
Some of the well known MS-Windows errors:
EMULTI Multitasking attempted, system confused
EKEYBOARD Keyboard locked, try getting out of this one!
EXPLAIN Unexplained error, please tell us what happened
EFUTURE Reserved for our future mistakes

/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

No comments: