* Should `get-file-buffer' be implemented in Elisp? @ 2023-07-16 18:40 Ihor Radchenko 2023-07-16 18:51 ` Eli Zaretskii 0 siblings, 1 reply; 10+ messages in thread From: Ihor Radchenko @ 2023-07-16 18:40 UTC (permalink / raw) To: emacs-devel Hi, AFAIU, we generally aim to move C functions to Elisp. And `get-file-buffer' does not appear to have anything that prevents it from being implemented in Elisp. So, should it? Are there any other known functions that need to be converted? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-16 18:40 Should `get-file-buffer' be implemented in Elisp? Ihor Radchenko @ 2023-07-16 18:51 ` Eli Zaretskii 2023-07-16 19:05 ` Ihor Radchenko 0 siblings, 1 reply; 10+ messages in thread From: Eli Zaretskii @ 2023-07-16 18:51 UTC (permalink / raw) To: Ihor Radchenko; +Cc: emacs-devel > From: Ihor Radchenko <yantar92@posteo.net> > Date: Sun, 16 Jul 2023 18:40:12 +0000 > > AFAIU, we generally aim to move C functions to Elisp. Only when there's a good reason to do so. > And `get-file-buffer' does not appear to have anything that prevents it > from being implemented in Elisp. > > So, should it? Are there any other known functions that need to be > converted? Let's not make changes without a good reason, okay? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-16 18:51 ` Eli Zaretskii @ 2023-07-16 19:05 ` Ihor Radchenko 2023-07-16 19:10 ` Eli Zaretskii 0 siblings, 1 reply; 10+ messages in thread From: Ihor Radchenko @ 2023-07-16 19:05 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> AFAIU, we generally aim to move C functions to Elisp. > > Only when there's a good reason to do so. Interesting. Then, my memory is failing me. I recall being told on emacs-devel that the general direction is to have as many things as possible in Elisp and reduce the C core. I stay corrected. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-16 19:05 ` Ihor Radchenko @ 2023-07-16 19:10 ` Eli Zaretskii 2023-07-16 20:19 ` Ihor Radchenko 0 siblings, 1 reply; 10+ messages in thread From: Eli Zaretskii @ 2023-07-16 19:10 UTC (permalink / raw) To: Ihor Radchenko; +Cc: emacs-devel > From: Ihor Radchenko <yantar92@posteo.net> > Cc: emacs-devel@gnu.org > Date: Sun, 16 Jul 2023 19:05:00 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> AFAIU, we generally aim to move C functions to Elisp. > > > > Only when there's a good reason to do so. > > Interesting. > Then, my memory is failing me. I recall being told on emacs-devel that > the general direction is to have as many things as possible in Elisp and > reduce the C core. > > I stay corrected. No need to stand corrected: the key is the interpretation of "as many as possible" -- it is not as simplistic as perhaps it could be. Basically, we have enough good reasons to rock the boat and make changes which could as side effects introduce bugs and subtle behavior change; let's not risk that when we don't have such a good reason. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-16 19:10 ` Eli Zaretskii @ 2023-07-16 20:19 ` Ihor Radchenko 2023-07-16 23:28 ` Po Lu 2023-07-17 5:06 ` tomas 0 siblings, 2 replies; 10+ messages in thread From: Ihor Radchenko @ 2023-07-16 20:19 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> I stay corrected. > > No need to stand corrected: the key is the interpretation of "as many > as possible" -- it is not as simplistic as perhaps it could be. > > Basically, we have enough good reasons to rock the boat and make > changes which could as side effects introduce bugs and subtle behavior > change; let's not risk that when we don't have such a good reason. Ok. My original motivation about `get-file-buffer' was an observation that searching alist might be sub-optimal. I now have (length (buffer-list)) ;=> 578 and I though that it might be a good idea to keep track of buffer name -> buffer associations in a hash table. In particular, when using `get-buffer-create', and the buffer name does not exist, Emacs has to scan all the buffer list, fail, and go ahead creating the buffer. Hash table would help significantly in such scenarios. And in general lookup as well as hash tables start to outperform alists just at 20-30 elements [1] But hacking C code and adding yet another internal variable looked like not justified. [1] https://flandrew.srht.site/listful/embracing-emacs-lisp-hash-tables-introducing-xht.html -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-16 20:19 ` Ihor Radchenko @ 2023-07-16 23:28 ` Po Lu 2023-07-17 5:06 ` tomas 1 sibling, 0 replies; 10+ messages in thread From: Po Lu @ 2023-07-16 23:28 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, emacs-devel Ihor Radchenko <yantar92@posteo.net> writes: > My original motivation about `get-file-buffer' was an observation that > searching alist might be sub-optimal. Let's wait for this problem to demonstrate itself in practice before looking for drastic solutions. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-16 20:19 ` Ihor Radchenko 2023-07-16 23:28 ` Po Lu @ 2023-07-17 5:06 ` tomas 2023-07-17 9:28 ` Ihor Radchenko 1 sibling, 1 reply; 10+ messages in thread From: tomas @ 2023-07-17 5:06 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1251 bytes --] On Sun, Jul 16, 2023 at 08:19:10PM +0000, Ihor Radchenko wrote: [...] > scenarios. And in general lookup as well as hash tables start to > outperform alists just at 20-30 elements [1] For me, it's more like 45-ish: (let* ((size 50) ; alist, hash size (runs 10000) ; benchmark runs (alist '()) (hash (make-hash-table :test 'eq :size 1549)) (keys (make-vector size nil)) (count size)) ;; setup (while (> count 0) (setq count (1- count)) (let ((sym (intern (format "SYM%04d%03d" (random 10000) count)))) (aset keys count sym) (setq alist (cons (cons sym "foo") alist)) (puthash sym "foo" hash))) ;; run (cons (benchmark runs '(assq (aref keys (random size)) alist)) (benchmark runs '(gethash (aref keys (random size)) hash)))) And even at 100, the absolute time is rather negligible. Somewhere near 5000 buffers my (not very fast) machine reaches the 100ms area for alists and lingers in the 2ms area for hashes (that would be where I'd start worrying). How many people around here have regularly 1000 buffers? Those simple alists are surprisingly fast (I, too have often the reflex to reach for hash tables, I know). Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-17 5:06 ` tomas @ 2023-07-17 9:28 ` Ihor Radchenko 2023-07-17 13:11 ` Eli Zaretskii 2023-07-17 17:48 ` tomas 0 siblings, 2 replies; 10+ messages in thread From: Ihor Radchenko @ 2023-07-17 9:28 UTC (permalink / raw) To: tomas; +Cc: Eli Zaretskii, emacs-devel <tomas@tuxteam.de> writes: > On Sun, Jul 16, 2023 at 08:19:10PM +0000, Ihor Radchenko wrote: > > [...] > >> scenarios. And in general lookup as well as hash tables start to >> outperform alists just at 20-30 elements [1] > > For me, it's more like 45-ish: Right. The link I provided actually also mentions similar number. > How many people around here have regularly 1000 buffers? Well. Check out https://github.com/org-roam/org-roam People routinely deal with thousands of buffers there and complain about that. I also did a benchmark for opening several thousands of files in Emacs and the performance was quite disappointing. (Though, admittedly, not because of `get-file-buffer'). > And even at 100, the absolute time is rather negligible. Somewhere > near 5000 buffers my (not very fast) machine reaches the 100ms > area for alists and lingers in the 2ms area for hashes (that would > be where I'd start worrying). 100ms is fast when you do it once. But `get-file-buffer' may be called rather frequently by `with-temp-buffer'. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-17 9:28 ` Ihor Radchenko @ 2023-07-17 13:11 ` Eli Zaretskii 2023-07-17 17:48 ` tomas 1 sibling, 0 replies; 10+ messages in thread From: Eli Zaretskii @ 2023-07-17 13:11 UTC (permalink / raw) To: Ihor Radchenko; +Cc: tomas, emacs-devel > From: Ihor Radchenko <yantar92@posteo.net> > Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org > Date: Mon, 17 Jul 2023 09:28:50 +0000 > > <tomas@tuxteam.de> writes: > > > On Sun, Jul 16, 2023 at 08:19:10PM +0000, Ihor Radchenko wrote: > > > > [...] > > > >> scenarios. And in general lookup as well as hash tables start to > >> outperform alists just at 20-30 elements [1] > > > > For me, it's more like 45-ish: > > Right. The link I provided actually also mentions similar number. > > > How many people around here have regularly 1000 buffers? > > Well. Check out https://github.com/org-roam/org-roam > People routinely deal with thousands of buffers there and complain about > that. > > I also did a benchmark for opening several thousands of files in Emacs > and the performance was quite disappointing. (Though, admittedly, not > because of `get-file-buffer'). > > > And even at 100, the absolute time is rather negligible. Somewhere > > near 5000 buffers my (not very fast) machine reaches the 100ms > > area for alists and lingers in the 2ms area for hashes (that would > > be where I'd start worrying). > > 100ms is fast when you do it once. But `get-file-buffer' may be called > rather frequently by `with-temp-buffer'. Performance improvement when there are many buffers is indeed a worthy goal, but if we want to make get-file-buffer as fast as possible, leaving it in C makes more sense. We can call hash-table functions from C as well; moreover, we can call them in a more efficient way, bypassing validity checks that primitives often perform on their arguments. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Should `get-file-buffer' be implemented in Elisp? 2023-07-17 9:28 ` Ihor Radchenko 2023-07-17 13:11 ` Eli Zaretskii @ 2023-07-17 17:48 ` tomas 1 sibling, 0 replies; 10+ messages in thread From: tomas @ 2023-07-17 17:48 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, emacs-devel [-- Attachment #1: Type: text/plain, Size: 2053 bytes --] On Mon, Jul 17, 2023 at 09:28:50AM +0000, Ihor Radchenko wrote: > <tomas@tuxteam.de> writes: > > > On Sun, Jul 16, 2023 at 08:19:10PM +0000, Ihor Radchenko wrote: > > > > [...] > > > >> scenarios. And in general lookup as well as hash tables start to > >> outperform alists just at 20-30 elements [1] > > > > For me, it's more like 45-ish: > > Right. The link I provided actually also mentions similar number. > > > How many people around here have regularly 1000 buffers? > > Well. Check out https://github.com/org-roam/org-roam > People routinely deal with thousands of buffers there and complain about > that. Oh, I see. The exciting thing about Emacs is that it has so many different usages :-) (I seldom surpass 10 or 12 buffers, FWIW). > I also did a benchmark for opening several thousands of files in Emacs > and the performance was quite disappointing. (Though, admittedly, not > because of `get-file-buffer'). Yes, it would be interesting to know which part the lookup plays in the grand scheme of things. > > And even at 100, the absolute time is rather negligible. Somewhere > > near 5000 buffers my (not very fast) machine reaches the 100ms > > area for alists and lingers in the 2ms area for hashes (that would > > be where I'd start worrying). > > 100ms is fast when you do it once. But `get-file-buffer' may be called > rather frequently by `with-temp-buffer'. Yes. I don't know about the original benchmark you quoted, but mine is extremely "synthetic" and therefore full of lies: the alist gets allocated in a tight loop and might show an unusual locality of reference, as far as lists go. OTOH, if you are shuffling heavy data structures in between lookups, the bigger hash structure might compete for low level caches. On the third hand, the bad locality of a "naturally grown" list might play havoc with TLB. And so on. The only real measure would be to measure how much of the perceived latency in org-roam is actually attributable to the lookup :-) Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-07-17 17:48 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-07-16 18:40 Should `get-file-buffer' be implemented in Elisp? Ihor Radchenko 2023-07-16 18:51 ` Eli Zaretskii 2023-07-16 19:05 ` Ihor Radchenko 2023-07-16 19:10 ` Eli Zaretskii 2023-07-16 20:19 ` Ihor Radchenko 2023-07-16 23:28 ` Po Lu 2023-07-17 5:06 ` tomas 2023-07-17 9:28 ` Ihor Radchenko 2023-07-17 13:11 ` Eli Zaretskii 2023-07-17 17:48 ` tomas
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).