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
Wednesday, December 26, 2012
Subscribe to:
Post Comments (Atom)
 
No comments:
Post a Comment