Wednesday, December 26, 2012

Re: Fold expression called too often

Hi Bram!

On Mi, 26 Dez 2012, Bram Moolenaar wrote:

>
> 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.

I have only tested it very basically against the given use case. Perhaps
Marco can tell, if this works better for his use cases.

regards,
Christian
--
Die Menschen wundern sich, dass ich es besser weiß wie sie, und
es ist kein Wunder, sie halten sehr oft für falsch, was ich denke.
-- Goethe, Maximen und Reflektionen, Nr. 1292

--
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: