Patch 7.4.2036
Problem: Looking up a buffer by number is slow if there are many.
Solution: Use a hashtab.
Files: src/structs.h, src/buffer.c
*** ../vim-7.4.2035/src/structs.h 2016-07-10 22:11:11.858751521 +0200
--- src/structs.h 2016-07-14 21:37:09.432147507 +0200
***************
*** 1753,1758 ****
--- 1753,1761 ----
unsigned int b_fab_mrs; /* Max record size */
#endif
int b_fnum; /* buffer number for this file. */
+ char_u b_key[VIM_SIZEOF_INT * 2 + 1];
+ /* key used for buf_hashtab, holds b_fnum as
+ hex string */
int b_changed; /* 'modified': Set to TRUE if something
in the
file has been changed and not written out. */
*** ../vim-7.4.2035/src/buffer.c 2016-07-10 22:11:11.854751580 +0200
--- src/buffer.c 2016-07-14 22:03:42.204827897 +0200
***************
*** 350,355 ****
--- 350,377 ----
}
/*
+ * A hash table used to quickly lookup a buffer by its number.
+ */
+ static hashtab_T buf_hashtab;
+
+ static void
+ buf_hashtab_add(buf_T *buf)
+ {
+ sprintf((char *)buf->b_key, "%x", buf->b_fnum);
+ if (hash_add(&buf_hashtab, buf->b_key) == FAIL)
+ EMSG(_("E931: Buffer cannot be registered"));
+ }
+
+ static void
+ buf_hashtab_remove(buf_T *buf)
+ {
+ hashitem_T *hi = hash_find(&buf_hashtab, buf->b_key);
+
+ if (!HASHITEM_EMPTY(hi))
+ hash_remove(&buf_hashtab, hi);
+ }
+
+ /*
* Close the link to a buffer.
* "action" is used when there is no longer a window for the buffer.
* It can be:
***************
*** 723,728 ****
--- 745,753 ----
#endif
#ifdef FEAT_AUTOCMD
aubuflocal_remove(buf);
+
+ buf_hashtab_remove(buf);
+
if (autocmd_busy)
{
/* Do not free the buffer structure while autocommands are executing,
***************
*** 1703,1708 ****
--- 1728,1735 ----
* functions for dealing with the buffer list
*/
+ static int top_file_num = 1; /* highest file number */
+
/*
* Add a file name to the buffer list. Return a pointer to the buffer.
* If the same file name already exists return a pointer to that buffer.
***************
*** 1715,1722 ****
* if the buffer already exists.
* This is the ONLY way to create a new buffer.
*/
- static int top_file_num = 1; /* highest file number */
-
buf_T *
buflist_new(
char_u *ffname, /* full path of fname or relative */
--- 1742,1747 ----
***************
*** 1729,1734 ****
--- 1754,1762 ----
stat_T st;
#endif
+ if (top_file_num == 1)
+ hash_init(&buf_hashtab);
+
fname_expand(curbuf, &ffname, &sfname); /* will allocate ffname */
/*
***************
*** 1907,1912 ****
--- 1935,1941 ----
}
top_file_num = 1;
}
+ buf_hashtab_add(buf);
/*
* Always copy the options from the current buffer.
***************
*** 2579,2597 ****
#endif
/*
! * find file in buffer list by number
*/
buf_T *
buflist_findnr(int nr)
{
! buf_T *buf;
if (nr == 0)
nr = curwin->w_alt_fnum;
! /* Assume newer buffers are used more often, start from the end. */
! for (buf = lastbuf; buf != NULL; buf = buf->b_prev)
! if (buf->b_fnum == nr)
! return buf;
return NULL;
}
--- 2608,2629 ----
#endif
/*
! * Find a file in the buffer list by buffer number.
*/
buf_T *
buflist_findnr(int nr)
{
! char_u key[VIM_SIZEOF_INT * 2 + 1];
! hashitem_T *hi;
if (nr == 0)
nr = curwin->w_alt_fnum;
! sprintf((char *)key, "%x", nr);
! hi = hash_find(&buf_hashtab, key);
!
! if (!HASHITEM_EMPTY(hi))
! return (buf_T *)(hi->hi_key
! - ((unsigned)(curbuf->b_key - (char_u *)curbuf)));
return NULL;
}
*** ../vim-7.4.2035/src/version.c 2016-07-14 20:37:03.884826159 +0200
--- src/version.c 2016-07-14 22:06:04.862738847 +0200
***************
*** 760,761 ****
--- 760,763 ----
{ /* Add new patch number below this line */
+ /**/
+ 2036,
/**/
--
GALAHAD: No. Look, I can tackle this lot single-handed!
GIRLS: Yes, yes, let him Tackle us single-handed!
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// 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.