patch 7.4.2018
Problem:    buf_valid() can be slow when there are many buffers.
Solution:   Add bufref_valid(), only go through the buffer list when a buffer
            was freed.
diff --git a/src/quickfix.c b/src/quickfix.c
index 065216a..1e5abc6 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -1487,7 +1487,7 @@
  * to make this a lot faster if there are multiple matches in the same file.
  */
 static char_u *qf_last_bufname = NULL;
-static buf_T  *qf_last_buf = NULL;
+static bufref_T  qf_last_bufref = {NULL, 0};
 
 /*
  * Get buffer number for file "dir.name".
@@ -1536,9 +1536,9 @@
 	bufname = fname;
 
     if (qf_last_bufname != NULL && STRCMP(bufname, qf_last_bufname) == 0
-	    && buf_valid(qf_last_buf))
+	    && bufref_valid(&qf_last_bufref))
     {
-	buf = qf_last_buf;
+	buf = qf_last_bufref.br_buf;
 	vim_free(ptr);
     }
     else
@@ -1549,7 +1549,7 @@
 	    qf_last_bufname = bufname;
 	else
 	    qf_last_bufname = vim_strsave(bufname);
-	qf_last_buf = buf;
+	set_bufref(&qf_last_bufref, buf);
     }
     if (buf == NULL)
 	return 0;