PATCH: avoid unnecessary copying of location list when creating a quickfix/location list window

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

PATCH: avoid unnecessary copying of location list when creating a quickfix/location list window

Lech Lorens
When splitting a window, all the location lists of the original window
are copied to the newly created one. If the newly created window is a
quickfix window or a location list window, the copied locations lists
are immediately destroyed. The attached patch prevents the copying if it
is unnecessary. This can shorten the execution time of the :copen,
:lopen, :cwindow, :lwindow commands significantly, particularly for
large location lists.

The speedup I measured varied between 4 and 50 times, depending on the
size of input. This might not be very meaningful, but my (very
subjective) feeling is that the comfort of getting a quickfix window
instantly is much greater than that of having to wait for 1.5 seconds.

--
Cheers,
Lech

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---


Index: src/quickfix.c
===================================================================
--- src/quickfix.c (revision 1352)
+++ src/quickfix.c (working copy)
@@ -2310,15 +2310,12 @@
  if (eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow)
     /* Create the new window at the very bottom. */
     win_goto(lastwin);
- if (win_split(height, WSP_BELOW) == FAIL)
+ if (win_split(height, WSP_BELOW | WSP_QUICKFIX) == FAIL)
     return; /* not enough room for window */
 #ifdef FEAT_SCROLLBIND
  curwin->w_p_scb = FALSE;
 #endif
 
- /* Remove the location list for the quickfix window */
- qf_free_all(curwin);
-
  if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
  {
     /*
Index: src/vim.h
===================================================================
--- src/vim.h (revision 1352)
+++ src/vim.h (working copy)
@@ -1057,6 +1057,7 @@
 #define WSP_HELP 16 /* creating the help window */
 #define WSP_BELOW 32 /* put new window below/right */
 #define WSP_ABOVE 64 /* put new window above/left */
+#define WSP_QUICKFIX 128 /* creating a quickfix/location list window */
 
 /*
  * arguments for gui_set_shellsize()
Index: src/window.c
===================================================================
--- src/window.c (revision 1352)
+++ src/window.c (working copy)
@@ -12,7 +12,7 @@
 static int path_is_url __ARGS((char_u *p));
 #if defined(FEAT_WINDOWS) || defined(PROTO)
 static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
-static void win_init __ARGS((win_T *newp, win_T *oldp));
+static void win_init __ARGS((win_T *newp, win_T *oldp, int flags));
 static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
 static void frame_setheight __ARGS((frame_T *curfrp, int height));
 #ifdef FEAT_VERTSPLIT
@@ -913,7 +913,7 @@
     return FAIL;
 
  /* make the contents of the new window the same as the current one */
- win_init(wp, curwin);
+ win_init(wp, curwin, flags);
     }
 
     /*
@@ -1162,11 +1162,14 @@
  * Initialize window "newp" from window "oldp".
  * Used when splitting a window and when creating a new tab page.
  * The windows will both edit the same buffer.
+ * WSP_QUICKFIX may be specified in flags to prevent the location list from
+ * being copied.
  */
     static void
-win_init(newp, oldp)
+win_init(newp, oldp, flags)
     win_T *newp;
     win_T *oldp;
+    int flags;
 {
     int i;
 
@@ -1191,7 +1194,16 @@
     copy_jumplist(oldp, newp);
 #endif
 #ifdef FEAT_QUICKFIX
-    copy_loclist(oldp, newp);
+    if (flags & WSP_QUICKFIX) /* If we are creating a quickfix window or a
+       * location list window, we don't want the
+       * location list.
+       */
+    {
+ newp->w_llist = NULL;
+ newp->w_llist_ref = NULL;
+    }
+    else
+ copy_loclist(oldp, newp);
 #endif
     if (oldp->w_localdir != NULL)
  newp->w_localdir = vim_strsave(oldp->w_localdir);
@@ -3221,7 +3233,7 @@
     else
     {
  /* First window in new tab page, initialize it from "oldwin". */
- win_init(curwin, oldwin);
+ win_init(curwin, oldwin, 0);
 
 # ifdef FEAT_SCROLLBIND
  /* We don't want scroll-binding in the first window. */
Reply | Threaded
Open this post in threaded view
|

Re: PATCH: avoid unnecessary copying of location list when creating a quickfix/location list window

Bram Moolenaar


Lech Lorens wrote:

> When splitting a window, all the location lists of the original window
> are copied to the newly created one. If the newly created window is a
> quickfix window or a location list window, the copied locations lists
> are immediately destroyed. The attached patch prevents the copying if it
> is unnecessary. This can shorten the execution time of the :copen,
> :lopen, :cwindow, :lwindow commands significantly, particularly for
> large location lists.
>
> The speedup I measured varied between 4 and 50 times, depending on the
> size of input. This might not be very meaningful, but my (very
> subjective) feeling is that the comfort of getting a quickfix window
> instantly is much greater than that of having to wait for 1.5 seconds.

Thanks.  I'll look into it later.

--
"I simultaneously try to keep my head in the clouds and my feet on the
ground.  Sometimes it's a stretch, though."              -- Larry Wall

 /// Bram Moolenaar -- [hidden email] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---