summaryrefslogtreecommitdiffstats
path: root/2021/talks/faster.md
blob: e8a134890af6b9f6c61dd4a44eeb9c68ecc06f97 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[[!meta title="Optimizing Emacs Lisp Code"]]
[[!meta copyright="Copyright © 2021 Dmitry Gutov"]]
[[!inline pages="internal(2021/info/faster-nav)" raw="yes"]]

<!-- You can manually edit this file to update the abstract, add links, etc. --->

# Optimizing Emacs Lisp Code
Dmitry Gutov

[[!inline pages="internal(2021/info/faster-schedule)" raw="yes"]]

[[!table header="no" class="speaker-details" data="""
Name pronunciation: | d-MEET-ri GOO-tov
Pronouns: | he/his 
Homepage: | <https://github.com/dgutov/>
Preferred contact info | <dgutov@yandex.ru> 
"""]]

-   Before optimizing, benchmark first.
-   Different benchmarking approaches.
-   Live evaluation, step-debugging, measuring from a debugger breakpoint.
-   How to determine if a function is expensive. How to pick one from
    competing alternatives (cl-lib, seq, dash, lean core).
-   Print-benchmarking.
-   Byte-compiled code can give a very different picture, changing where
    the bottleneck is. How to quickly load a byte-compiled version.
-   Steps taken to speed up the Xref package recently.

# Discussion

IRC nick: dgutov

BBB:

- AVL tree
- defstruct accessors should expand with compiler macros to aref calls, which are very fast
- They have extra if though
- oh you mean for testing whether the value is such a struct?
- yes there is that test, but I wouldn't expect that to make it 3x slower, AFAIK

IRC: 

- If somebody wants to do a remote session with me: I do have processes such as updating column view dynamic blocks that take maybe 40 minutes. So far, I avoid executing those functions when I'm around the computer myself. However, there may be room for improvement and I really can't tell wether it is in my personal setup or not because it's not always that easy to re-create a use-case with plain Emacs cnofig
- Thanks for doing this talk.  FYI you might find the this bench-multi-lexical macro useful: https://alphapapa.github.io/emacs-package-dev-handbook/#outline-container-Optimization
  - dgutov: I can't seem to find the exact macro you are referring to. But if it covers a use case benchmark-progn does not, consider contributing it to benchmark.el in the core.
  - Sorry, try this link directly to that macro: https://github.com/alphapapa/emacs-package-dev-handbook#bench-multi-lexical The purpose of the macro is to compare different forms and show how they perform relative to each other
  - dgutov: Ah yeah, that looks pretty cool. Less sure about the org format, but it must be nice for presentations.
  - The Org format is good for documentation too.  But it just uses the output of benchmark-run, so it could easily be left in Lisp form.  :)
  - dgutov: These things are really handy to have available in 'emacs -Q', though. When you're working on shaving some extra handful of percents.
  - Yes, a few lines of code could be added to run the compiled code in a separate Emacs process.
- https://github.com/alphapapa/emacs-package-dev-handbook compares some common ways to do common things in Elisp so you can see which is generally faster, e.g. https://github.com/alphapapa/emacs-package-dev-handbook#inserting-strings
- PSA: buffer-local-value is generally much faster than with-current-buffer if all you need to do is get the value of a variable in a buffer
- For more info about the performance of overlays vs text properties data structure, there's an Emacs TODO about it. C-h C-t and search for "Move overlays to intervals.c".
- cl-defstruct getters/setters have compiler macros that expand into simple aref calls on vectors, they are very efficient

[[!inline pages="internal(2021/captions/faster)" raw="yes"]]

[[!inline pages="internal(2021/info/faster-nav)" raw="yes"]]