Ramel Eshed wrote:
> On Friday, June 3, 2016 at 12:17:15 PM UTC+3, Bram Moolenaar wrote:
> > Ramel Eshed wrote:
> >
> > > Hi Bram and Yegappan,
> > >
> > > Yegappan, You were right -saving the qf_last makes a big difference. I
> > > probably checked your patch after using many quickfix operations (see
> > > below).
> > >
> > > Let me summarize the problems found so far using the agrep plugin:
> > >
> > > 1. SEGV crashes - fixed
> > > 2. Vim hangs while quickfix window is opened - fixed.
> > > 3. GUI hangs - fixed
> > > 4. Timer issue in the GUI - fixed
> > >
> > > 5. quickfix is slow in general - it's much better with Yegappan's patch
> > > or 1881 but Vim is still not as responsive as it is when using the same
> > > search without quickfix (with Agrep window). Following are the top lines
> > > from the profiler log, in case you'll see something that can be optimized:
> > >
> > > % cumulative self self total
> > > time seconds seconds calls ms/call ms/call name
> > > 11.34 0.11 0.11 11084 0.01 0.01 buf_valid
> > > 10.31 0.21 0.10 11378 0.01 0.01 do_cmdline
> > > 5.15 0.26 0.05 9912382 0.00 0.00 otherfile_buf
> > > 5.15 0.31 0.05 452997 0.00 0.00 get_func_tv
> > > 5.15 0.36 0.05 11083 0.00 0.02 buflist_new
> > > 5.15 0.41 0.05 11082 0.00 0.01
> > > buflist_findname_stat
> > > 5.15 0.46 0.05 2131 0.02 0.02 buflist_findnr
> > >
> > > 6. Agrep become very slow after using the quickfix list many times. Well,
> > > this is what I see in the profiler log:
> > > % cumulative self self total
> > > time seconds seconds calls ms/call ms/call name
> > > 55.98 4.21 4.21 33246 0.13 0.13 qf_mark_adjust <<<
> > > 12.10 5.12 0.91 50685 0.02 0.02 buf_valid
> > > 6.38 5.60 0.48 11091 0.04 0.05 buflist_findpat
> > > 5.05 5.98 0.38 13256 0.03 0.03 buflist_findnr
> > >
> > > It looks like qf_mark_adjust is called each time line is appended to a
> > > buffer using 'out_io': 'buffer' for each entry in any quickfix list
> > > available. Can we avoid this?
> >
> > No, this is needed. But why is a buffer changed? I thought you were
> > adding quickfix entries, which doesn't trigger adjusting marks. Only
> > inserting/deleting a line in a buffer triggers this.
>
> Because of adding quickfix entries was slow I've created my own buffer
> to display the search results (you can see an animated gif here:
> http://i.imgur.com/epffEDH.gif).
> I need to perform some manipulations on the grep results in order to
> get the column numbers and to highlight the matching text. Currently,
> this is done in the out_cb function which sends the modified line to
> my special buffer via a separate 'cat' job (this is the workaround I
> found as a replacement to setbufline() :)).
So this buffer that's changing does not have entries in the quickfix
list, right? I think I can add a trick to skip buffers that don't have
any quickfix entries. That should solve your problem and is fairly
simple to implement.
> > The reason this is needed, is that when you have a list of errors in
> > various files, which are at specific line numbers, and you make changes
> > in files, the line numbers need to be adjusted.
> >
> > Since the qf_last change helped a lot, I susped just going through all
> > the quickfix entries is making it slow. We would need to use another
> > data structure, which lists all the quickfix entries related to a
> > buffer. Then we only need to look at the ones that might actually
> > change. Keeping that list updated will be extra work though. In
> > different circumstances it may actually make it slower.
>
> I think that in cases like this -when lines are appended to a buffer
> by a job (using 'out_io': 'buffer') we don't need to adjust the
> quickfix marks since the target buffer is probably not included in any
> quickfix list. Is there a corresponding option to the :lockmarks
> command (like 'eventignore' and :noautocmd)?
Adjusting marks for adding a line below the last one indeed doesn't have
much effect. It's possible that there is a mark when lines have been
deleted, but it will stick to the end anyway.
> Because of the serious performance impact of many quickfix entries, I
> think we should have a built in command for freeing a quickfix list. I
> guess I can use :call setqflist([], 'r'), but it'll leave an empty
> list and it'd be nicer to remove the list completely.
> Also, I noticed that using :call setqflist([]) while there is only one
> list will add a new empty list, and will delete the last list when
> there is more than one list. According to the help it should behave
> like setqflist([], 'r'):
>
> If you supply an empty {list}, the quickfix list will be
> cleared.
Yes, that is supposed to work.
--
Just remember...if the world didn't suck, we'd all fall off.
/// Bram Moolenaar -- [email protected] -- 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_dev" 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
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.