GNU bug report logs - #24048
25.0.95; syntax-ppss can be slow

Previous Next

Package: emacs;

Reported by: Aaron Jensen <aaronjensen <at> gmail.com>

Date: Thu, 21 Jul 2016 14:31:02 UTC

Severity: normal

Tags: moreinfo

Found in version 25.0.95

Done: Lars Ingebrigtsen <larsi <at> gnus.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 24048 in the body.
You can then email your comments to 24048 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Thu, 21 Jul 2016 14:31:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Aaron Jensen <aaronjensen <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 21 Jul 2016 14:31:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: "bug-gnu-emacs <at> gnu.org" <bug-gnu-emacs <at> gnu.org>
Subject: 25.0.95; syntax-ppss can be slow
Date: Thu, 21 Jul 2016 07:29:19 -0700
[Message part 1 (text/plain, inline)]
In certain situations, the caching of syntax-ppss can seem to be
insufficient for good performance when syntax-ppss is invoked in a tight
loop. smartparens is a popular package that currently invokes
syntax-ppss in a tight loop (about 30-100 times depending on how many
match pairs are configured). syntax-ppss has caching built in, but it is
willing to use a cache from a further back position and do a
`parse-partial-sexp` from the old position to the current. Afterwards,
it does not set the cache with the current position. As such, in the
pathological case, it can parse ~2000 characters 30-100 times in a tight
loop. This is slow enough to show up in profiling and affect typing
latency.

To repro, install:

smartparens (you can use
https://github.com/aaronjensen/smartparens/tree/limit-binding-of-case-fold-search
to alleviate a different performance issue which could distract in the profiling)
elixir-mode

Load this file into a buffer, ensure elixir-mode is enabled: https://gist.github.com/aaronjensen/d4cd40347a916dd36c8239afecf64a7d

Go down to the chunk_by function and type inside of it. If you profile,
you'll see that syntax-ppss rises to the top. Here is an example
reversed profile:

+ redisplay 218 32%
- progn 120 18%
- if 120 18%
- condition-case 120 18%
- let 120 18%
+ syntax-ppss 120 18%
+ sit-for 101 15%
+ sp--looking-back 55 8%
+ font-lock-fontify-keywords-region 45 6%
+ alchemist-project-root 41 6%

For what it is worth, if the file is longer this tends to not happen as
syntax-ppss ends up executing for something (end of buffer it seems) outside of the "close"
heuristic which will ultimately cause the syntax-ppss-last to get set to
the current position for the tight loop. The issue is only when the
first branch of syntax-ppss is taken in a tight loop and pos - old-pos
is great enough.

Please see https://github.com/Fuco1/smartparens/pull/629 for additional
context and discussion.

Thanks!

Aaron

In GNU Emacs 25.0.95.1 (x86_64-apple-darwin15.5.0, NS appkit-1404.47 Version 10.11.5 (Build 15F34))
of 2016-06-10 built on aaronmbp.local
Windowing system distributor 'Apple', version 10.3.1404
Configured using:
'configure --disable-dependency-tracking --disable-silent-rules
--enable-locallisppath=/usr/local/share/emacs/site-lisp
--infodir=/usr/local/Cellar/emacs/25.0.95/share/info/emacs
--prefix=/usr/local/Cellar/emacs/25.0.95 --with-xml2 --without-dbus
--with-gnutls --with-rsvg --with-imagemagick --with-ns
--disable-ns-self-contained'

Configured features:
JPEG RSVG IMAGEMAGICK NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS
NS

Important settings:
value of $LANG: en_US.UTF-8
locale-coding-system: utf-8-unix

Major mode: Elixir

Minor modes in effect:
alchemist-mode: t
goto-address-prog-mode: t
bug-reference-prog-mode: t
auto-highlight-symbol-mode: t
clean-aindent-mode: t
highlight-numbers-mode: t
highlight-parentheses-mode: t
rainbow-delimiters-mode: t
yas-global-mode: t
yas-minor-mode: t
projectile-global-mode: t
projectile-mode: t
recentf-mode: t
shackle-mode: t
global-hungry-delete-mode: t
hungry-delete-mode: t
evil-mc-mode: t
hl-todo-mode: t
global-spacemacs-whitespace-cleanup-mode: t
spacemacs-whitespace-cleanup-mode: t
ws-butler-global-mode: t
ws-butler-mode: t
winner-mode: t
window-numbering-mode: t
volatile-highlights-mode: t
global-vi-tilde-fringe-mode: t
vi-tilde-fringe-mode: t
spaceline-info-mode: t
spaceline-helm-mode: t
save-place-mode: t
savehist-mode: t
popwin-mode: t
persp-mode: t
Info-breadcrumbs-in-mode-line-mode: t
ido-vertical-mode: t
helm-mode: t
global-git-gutter+-mode: t
global-git-commit-mode: t
async-bytecomp-package-mode: t
shell-dirtrack-mode: t
flyspell-mode: t
global-flycheck-mode: t
flycheck-mode: t
flx-ido-mode: t
eyebrowse-mode: t
global-evil-surround-mode: t
evil-surround-mode: t
global-evil-search-highlight-persist: t
evil-search-highlight-persist: t
show-smartparens-global-mode: t
show-smartparens-mode: t
smartparens-mode: t
evil-escape-mode: t
global-anzu-mode: t
anzu-mode: t
eval-sexp-fu-flash-mode: t
diff-auto-refine-mode: t
company-mode: t
hybrid-mode: t
which-key-mode: t
override-global-mode: t
global-undo-tree-mode: t
undo-tree-mode: t
evil-mode: t
evil-local-mode: t
spacemacs-leader-override-mode: t
global-spacemacs-leader-override-mode: t
global-hl-line-mode: t
xterm-mouse-mode: t
global-auto-revert-mode: t
global-page-break-lines-mode: t
global-eldoc-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
column-number-mode: t
line-number-mode: t
transient-mark-mode: t
abbrev-mode: t
hs-minor-mode: t

Recent messages:
20394 19299 [100 times]
20390 19299 [2 times]
20394 19299
syntax-ppss
No profiler stopped
CPU profiler started
CPU profiler stopped
CPU profiler started
Quit
Mark saved where search started [2 times]

Load-path shadows:
/Users/aaronjensen/.emacs.d/elpa/helm-20160718.746/helm-multi-match hides /Users/aaronjensen/.emacs.d/elpa/helm-core-20160718.746/helm-multi-match
/Users/aaronjensen/.emacs.d/elpa/ox-gfm-20160520.2040/ox-gfm hides /Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-gfm
/Users/aaronjensen/.emacs.d/elpa/org-download-20160620.607/org-download hides /Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-download
/Users/aaronjensen/.emacs.d/elpa/org-bullets-20140918.1137/org-bullets hides /Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-bullets
/Users/aaronjensen/.emacs.d/elpa/ht-20150830.1115/ht hides ~/.emacs.d/core/libs/ht
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-texinfo hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-texinfo
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-publish hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-publish
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-org hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-org
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-odt hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-odt
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-md hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-md
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-man hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-man
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-latex hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-latex
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-icalendar hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-icalendar
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-html hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-html
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-beamer hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-beamer
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ox-ascii hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ox-ascii
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-w3m hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-w3m
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-version hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-version
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-timer hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-timer
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-table hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-table
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-src hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-src
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-rmail hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-rmail
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-protocol hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-protocol
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-plot hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-plot
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-pcomplete hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-pcomplete
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-mouse hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-mouse
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-mobile hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-mobile
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-mhe hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-mhe
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-macs hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-macs
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-macro hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-macro
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-loaddefs hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-loaddefs
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-list hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-list
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-irc hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-irc
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-install hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-install
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-inlinetask hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-inlinetask
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-info hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-info
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-indent hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-indent
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-id hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-id
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-habit hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-habit
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-gnus hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-gnus
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-footnote hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-footnote
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-feed hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-feed
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-faces hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-faces
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-eshell hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-eshell
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-entities hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-entities
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-element hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-element
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-docview hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-docview
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-datetree hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-datetree
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-ctags hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-ctags
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-crypt hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-crypt
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-compat hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-compat
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-colview hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-colview
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-clock hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-clock
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-capture hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-capture
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-bibtex hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-bibtex
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-bbdb hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-bbdb
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-attach hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-attach
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-archive hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-archive
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/org-agenda hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/org-agenda
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-tangle hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-tangle
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-table hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-table
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-sqlite hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-sqlite
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-sql hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-sql
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-shen hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-shen
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-screen hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-screen
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-scheme hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-scheme
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-scala hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-scala
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-sass hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-sass
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-ruby hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-ruby
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-ref hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-ref
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-R hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-R
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-python hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-python
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-plantuml hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-plantuml
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-picolisp hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-picolisp
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-perl hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-perl
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-org hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-org
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-octave hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-octave
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-ocaml hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-ocaml
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-mscgen hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-mscgen
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-maxima hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-maxima
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-matlab hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-matlab
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-makefile hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-makefile
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-lob hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-lob
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-lisp hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-lisp
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-lilypond hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-lilypond
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-ledger hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-ledger
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-latex hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-latex
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-keys hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-keys
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-js hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-js
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-java hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-java
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-io hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-io
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-haskell hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-haskell
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-gnuplot hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-gnuplot
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-fortran hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-fortran
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-exp hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-exp
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-eval hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-eval
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-emacs-lisp hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-emacs-lisp
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-dot hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-dot
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-ditaa hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-ditaa
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-css hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-css
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-core hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-core
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-comint hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-comint
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-clojure hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-clojure
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-calc hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-calc
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-C hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-C
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-awk hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-awk
/Users/aaronjensen/.emacs.d/elpa/org-plus-contrib-20160718/ob-asymptote hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/org/ob-asymptote
/Users/aaronjensen/.emacs.d/elpa/seq-2.16/seq hides /usr/local/Cellar/emacs/25.0.95/share/emacs/25.0.95/lisp/emacs-lisp/seq

Features:
(shadow sort mail-extr emacsbug evil-nerd-commenter
evil-nerd-commenter-operator tabify helm-command helm-elisp helm-eval
misearch multi-isearch network-stream nsm starttls dockerfile-mode
alchemist alchemist-macroexpand alchemist-company alchemist-help
alchemist-complete alchemist-refcard alchemist-phoenix alchemist-compile
alchemist-iex alchemist-message alchemist-hooks alchemist-hex
alchemist-mix alchemist-info alchemist-goto alchemist-scope
alchemist-eval alchemist-interact alchemist-server alchemist-execute
alchemist-report alchemist-test-mode alchemist-project alchemist-file
alchemist-key alchemist-utils elixir-mode pkg-info epl elixir-smie
company-tern dash-functional js-doc iswitchb js2-imenu-extras
js2-refactor js2r-paredit js2r-conveniences js2r-conditionals
js2r-wrapping js2r-functions js2r-vars js2r-iife js2r-formatting
js2r-helpers skewer-mode cache-table simple-httpd tern cursor-sensor
js2-mode js cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles
cc-align cc-engine cc-vars cc-defs imenu flycheck-elm company-robe
evil-matchit robe url-handlers inf-ruby rubocop ruby-tools sh-script
executable yaml-mode auto-compile packed elisp-slime-nav
evil-cleverparens evil-cleverparens-text-objects evil-cleverparens-util
paredit lispy swiper ivy delsel iedit iedit-lib multiple-cursors-core
lispy-inline avy semantic/db eieio-base semantic/util-modes
semantic/util semantic semantic/tag semantic/lex semantic/fw mode-local
cedet evil-ediff ediff-merg ediff-wind ediff-diff ediff-mult ediff-help
ediff-init ediff-util ediff edebug lispy-tags goto-addr bug-reference
auto-highlight-symbol clean-aindent-mode highlight-numbers parent-mode
highlight-parentheses hideshow rainbow-delimiters company-files
company-keywords company-etags company-gtags company-template
company-dabbrev-code company-dabbrev company-capf org-eldoc evil-org
ob-shell org-bullets org-download url-http tls gnutls url-auth url-gw
toc-org ert debug clojure-snippets yasnippet image-file org-rmail
org-mhe org-irc org-info org-gnus org-docview org-bibtex bibtex org-bbdb
org-w3m mu4e-maildirs-extension org-mu4e mu4e mu4e-speedbar speedbar
sb-image ezimage dframe mu4e-main mu4e-context mu4e-view epa
mu4e-headers mu4e-compose mu4e-draft mu4e-actions rfc2368 smtpmail
sendmail mu4e-mark mu4e-message html2text mu4e-proc mu4e-utils doc-view
jka-compr mu4e-lists mu4e-vars mu4e-meta ox-gfm ox-md ox-latex
ox-icalendar ox-html ox-ascii ox-publish ox org-element avl-tree org
org-macro org-footnote org-pcomplete org-list org-faces org-entities
org-version ob-emacs-lisp ob ob-tangle ob-ref ob-lob ob-table ob-exp
org-src ob-keys ob-comint ob-core ob-eval org-compat org-macs
org-loaddefs cal-menu calendar cal-loaddefs vc-git projectile grep
ibuf-ext ibuffer recentf tree-widget shackle hungry-delete
fill-or-unfill fix-autorevert-breaking-git eval-overlay
fix-bracketed-paste company-simple-complete init-terminal-cursor
evil-terminal-cursor-changer init-org init-magit init-elixir init-deft
evil-mc evil-mc-command-execute evil-mc-command-record
evil-mc-cursor-make evil-mc-region evil-mc-cursor-state evil-mc-undo
evil-mc-vars evil-mc-known-commands evil-mc-common hl-todo xterm-color
spacemacs-whitespace-cleanup ws-butler winner window-numbering etags
xref project volatile-highlights vi-tilde-fringe tmux spaceline-config
spaceline-segments spaceline powerline powerline-separators color
powerline-themes smartparens-config smartparens-ruby smartparens-html
saveplace savehist ruby-test-mode pcre2el rxt re-builder ruby-mode smie
popwin persp-mode osx-trash info+ image-mode ido-vertical-mode helm-mode
helm-files image-dired dired-x dired-aux ffap helm-buffers helm-elscreen
helm-tags helm-bookmark helm-adaptive helm-info bookmark pp helm-locate
helm-grep helm-regexp helm-external helm-net browse-url xml url
url-proxy url-privacy url-expand url-methods url-history url-cookie
url-domsuf url-util mailcap helm-utils compile helm-help helm-types
git-gutter-fringe+ fringe-helper git-gutter+ git-commit with-editor
async-bytecomp async tramp-sh server log-edit message rfc822 mml mml-sec
epg mailabbrev mail-utils gmm-utils mailheader pcvs-util add-log
docker-tramp tramp-cache tramp tramp-compat tramp-loaddefs trampver
shell pcomplete comint ansi-color flyspell-correct-helm helm helm-source
helm-multi-match helm-lib dired flyspell-correct flyspell ispell
flycheck find-func flx-ido flx ido eyebrowse format-spec
exec-path-from-shell evil-unimpaired f s evil-surround
evil-search-highlight-persist evil-numbers evil-lisp-state smartparens
evil-indent-plus evil-exchange evil-escape evil-args evil-anzu anzu
cider-eval-sexp-fu eval-sexp-fu rx highlight noutline outline diff-hl
vc-dir ewoc vc vc-dispatcher diff-mode company-web dash company-css
company web-completion-data adaptive-wrap hybrid-mode
evil-evilified-state which-key use-package diminish bind-key hydra lv
cus-edit cus-start cus-load evil evil-integration undo-tree diff
evil-maps evil-commands evil-jumps evil-command-window evil-types
evil-search evil-ex evil-macros evil-repeat evil-states evil-core
evil-common windmove thingatpt rect evil-digraphs evil-vars ring info
bind-map quelpa url-parse auth-source gnus-util password-cache url-vars
package-build mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047
rfc2045 ietf-drums mm-util help-fns mail-prsvr json map lisp-mnt hl-line
xt-mouse autorevert filenotify disp-table wid-edit monokai-theme
finder-inf init-html init-javascript sgml-mode init-evil
core-configuration-layer eieio-compat cl-seq ht cl warnings package
epg-config seq eieio byte-opt bytecomp byte-compile cl-extra help-mode
cconv eieio-core core-spacemacs core-use-package-ext
core-transient-state core-micro-state core-toggle core-keybindings
core-fonts-support core-spacemacs-buffer derived edmacro kmacro
core-funcs cl-macs gv core-themes-support core-display-init
core-auto-completion core-release-management core-dotspacemacs
core-command-line core-debug advice profiler easymenu cl-loaddefs cl-lib
page-break-lines easy-mmode subr-x pcase time-date mule-util tooltip
eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel
ns-win ucs-normalize term/common-win tool-bar dnd fontset image
regexp-opt fringe tabulated-list newcomment elisp-mode lisp-mode
prog-mode register page menu-bar rfn-eshadow timer select scroll-bar
mouse jit-lock font-lock syntax facemenu font-core frame cl-generic cham
georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese charscript case-table epa-hook
jka-cmpr-hook help simple abbrev minibuffer cl-preloaded nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 1068122 891337)
(symbols 48 82031 35)
(miscs 40 6570 10733)
(strings 32 209973 395364)
(string-bytes 1 7368564)
(vectors 16 130382)
(vector-slots 8 2505920 346982)
(floats 8 1994 3740)
(intervals 56 13720 14404)
(buffers 976 61))

Aaron

[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Mon, 25 Jul 2016 01:17:01 GMT) Full text and rfc822 format available.

Message #8 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Dmitry Gutov <dgutov <at> yandex.ru>
To: Aaron Jensen <aaronjensen <at> gmail.com>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Mon, 25 Jul 2016 04:16:45 +0300
Hi Aaron,

On 07/21/2016 05:29 PM, Aaron Jensen wrote:
>
> In certain situations, the caching of syntax-ppss can seem to be
> insufficient for good performance when syntax-ppss is invoked in a tight
> loop. smartparens is a popular package that currently invokes
> syntax-ppss in a tight loop (about 30-100 times depending on how many
> match pairs are configured). syntax-ppss has caching built in, but it is
> willing to use a cache from a further back position and do a
> `parse-partial-sexp` from the old position to the current. Afterwards,
> it does not set the cache with the current position. As such, in the
> pathological case, it can parse ~2000 characters 30-100 times in a tight
> loop. This is slow enough to show up in profiling and affect typing
> latency.
>
> To repro, install:
>
> smartparens (you can use
> https://github.com/aaronjensen/smartparens/tree/limit-binding-of-case-fold-search
> to alleviate a different performance issue which could distract in the
> profiling)
> elixir-mode

Is there a way to reproduce it more easier? Maybe without smartparens, 
just with elixir-mode, if it's sufficient to illustrate the performance 
problem (I recall you stating parse-partial-sexp is also unusually slow 
in that major mode, for some reason).

Here, I'm seeing some similar behavior with elisp-mode.el. I can open 
this file, evaluate

(benchmark 1000 '(syntax-ppss))

at line 10, then move to line 70 and do it there, and see the latter 
result to be much faster. They're still below 100ms usually (even with 
1000 repetitions), so that's hardly a good example of a performance 
problem, by itself.

P.S. Please send a text email next time, we very much prefer them for 
various reasons, inability to sneak in a tracker like this among them:

<img 
src=3D=22h=ttp://pixels.canarymail.io/tracking/07C7B5E0-9441-40AD-9CC3-D2A176741827.=png=22 
id=3D=22141121424AC1=466A74CBB8A45B347C37B=22 style=3D=22width: 1p=x; 
height: 1px;=22>




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Mon, 25 Jul 2016 07:13:01 GMT) Full text and rfc822 format available.

Message #11 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Dmitry Gutov <dgutov <at> yandex.ru>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Mon, 25 Jul 2016 07:12:42 +0000
[Message part 1 (text/plain, inline)]
Hi Dmitry,

On Sun, Jul 24, 2016 at 6:16 PM Dmitry Gutov <dgutov <at> yandex.ru> wrote:

> Is there a way to reproduce it more easier? Maybe without smartparens,
> just with elixir-mode, if it's sufficient to illustrate the performance
> problem (I recall you stating parse-partial-sexp is also unusually slow
> in that major mode, for some reason).
>

Sure, just use elixir-mode and this file
https://gist.githubusercontent.com/aaronjensen/d4cd40347a916dd36c8239afecf64a7d/raw/b52440bb51b96193a365a7f4cc1c8733ba98476f/syntax-ppss-slow-repro.ex

Then do: (benchmark 100 '(syntax-ppss)) at the top of the file and compare
it to doing it within the `chunk_by` function at the bottom of the file.
For me it’s 0.2ms at the top and 5.6ms at the bottom. Smartparens can do
50-100 syntax-ppss calls for every self-insert-command, and 5.6ms is
significant latency to add on to every keypress.

I have a proposed pull to get smartparens to memoize syntax-ppss itself
https://github.com/Fuco1/smartparens/pull/629 but in theory it should be
redundant given syntax-ppss’s built in caching.

P.S. Please send a text email next time, we very much prefer them for
> various reasons, inability to sneak in a tracker like this among them:
>

Unfortunately, modern email clients don’t really offer this as an option
anymore. I started to set up mu4e but it just became too much work to set
up for the sole purpose of being able to send text emails to report emacs
bugs. This probably isn’t the place to debate the merits of easy for most
people to use bug reporting.

<img
> src=3D=22h=ttp://
> pixels.canarymail.io/tracking/07C7B5E0-9441-40AD-9CC3-D2A176741827.=png=22
> id=3D=22141121424AC1=466A74CBB8A45B347C37B=22 style=3D=22width: 1p=x;
> height: 1px;=22>
>

Yeah, canary isn’t even the client I’m using anymore, it’s just what emacs
happened to open when I told it to open my email client to send the bug
report. Unless Inbox is doing its own weirdness this mail should be
tracking pixel free.
-- 
Aaron
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Mon, 25 Jul 2016 12:43:01 GMT) Full text and rfc822 format available.

Message #14 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Dmitry Gutov <dgutov <at> yandex.ru>
To: Aaron Jensen <aaronjensen <at> gmail.com>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Mon, 25 Jul 2016 15:42:22 +0300
On 07/25/2016 10:12 AM, Aaron Jensen wrote:

> Sure, just use elixir-mode and this
> file https://gist.githubusercontent.com/aaronjensen/d4cd40347a916dd36c8239afecf64a7d/raw/b52440bb51b96193a365a7f4cc1c8733ba98476f/syntax-ppss-slow-repro.ex
>
> Then do: (benchmark 100 '(syntax-ppss)) at the top of the file and
> compare it to doing it within the `chunk_by` function at the bottom of
> the file. For me it’s 0.2ms at the top and 5.6ms at the bottom.
> Smartparens can do 50-100 syntax-ppss calls for every
> self-insert-command, and 5.6ms is significant latency to add on to every
> keypress.

Is 5.6ms really significant? You should be typing like 200 characters 
per _second_ to really notice the difference.

Even 12ms that I'm getting at the bottom of your example file doesn't 
sound like it should have effect on the perceptible latency.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Mon, 25 Jul 2016 15:09:01 GMT) Full text and rfc822 format available.

Message #17 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Dmitry Gutov <dgutov <at> yandex.ru>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Mon, 25 Jul 2016 15:08:11 +0000
[Message part 1 (text/plain, inline)]
On Mon, Jul 25, 2016 at 5:42 AM Dmitry Gutov <dgutov <at> yandex.ru> wrote:

> Is 5.6ms really significant? You should be typing like 200 characters
> per _second_ to really notice the difference.
>
> Even 12ms that I'm getting at the bottom of your example file doesn't
> sound like it should have effect on the perceptible latency.
>

That’s a totally fair question, but yes, I can feel the difference while
typing. Ever since switching to Emacs I could feel significant latency in
my setup so I’ve been on a quest to bring it down. That quest led me to
smartparens and first to that case-fold-search binding issue and now here.

Even if one can’t feel 5.6ms, it becomes another brick in the bag, i.e. if
another minor mode did something similar and added another 5.6ms. With
enough of them most people could probably feel it.

If you haven’t read it, I recommend looking over
https://pavelfatin.com/typing-with-pleasure/

He has a tool on there for measuring typing latency. Here is a histogram of
the difference between typing at the bottom of the sample file, the top,
and the bottom with memoizing syntax-ppss in smartparens:

[image: Bottom VS Top VS Memoize Bottom.png]
<https://pavelfatin.com/typing-with-pleasure/>
-- 
Aaron
[Message part 2 (text/html, inline)]
[Bottom VS Top VS Memoize Bottom.png (image/png, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Fri, 30 Mar 2018 13:10:01 GMT) Full text and rfc822 format available.

Message #20 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Dmitry Gutov <dgutov <at> yandex.ru>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Fri, 30 Mar 2018 06:09:45 -0700
On Mon, Jul 25, 2016 at 8:08 AM, Aaron Jensen <aaronjensen <at> gmail.com> wrote:
> On Mon, Jul 25, 2016 at 5:42 AM Dmitry Gutov <dgutov <at> yandex.ru> wrote:
>>
>> Is 5.6ms really significant? You should be typing like 200 characters
>> per _second_ to really notice the difference.
>>
>> Even 12ms that I'm getting at the bottom of your example file doesn't
>> sound like it should have effect on the perceptible latency.
>
> Even if one can’t feel 5.6ms, it becomes another brick in the bag, i.e. if another minor mode did something similar and added another 5.6ms. With enough of them most people could probably feel it.

Hey all, I'm trying to clean up bugs I've submitted. This one is still
an issue of sorts. I've fixed the downstream usage of syntax-ppss by
memoizing it, but that feels like it should be unnecessary given that
syntax-ppss is meant to do its own caching.

The problem here is that syntax-ppss will not update its cache if it
is "close enough" to the old position. In languages like Elixir (and
probably Ruby) the old position is often the beginning of the outer
module which spans most, if not all of the file. This means that the
further you get down the file, the further you get from the old
position and the more work syntax-ppss must do.

If a user of syntax-ppss is not careful (as was the case in
smartparens) then syntax-ppss can be called multiple times in
succession, which can add up to enough latency to be noticed.

Ultimately, it seems like it may be worth reconsidering this condition:

(and old-pos (< (- pos old-pos)
    ;; The time to use syntax-begin-function and
    ;; find PPSS is assumed to be about 2 * distance.
    (* 2 (/ (cdr (aref syntax-ppss-stats 5))
    (1+ (car (aref syntax-ppss-stats 5)))))))

But I do not know what other impacts that may have.

Does anybody have any new thoughts on this?

Thanks!




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Wed, 01 Dec 2021 19:48:01 GMT) Full text and rfc822 format available.

Message #23 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: 24048 <at> debbugs.gnu.org, Dmitry Gutov <dgutov <at> yandex.ru>
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Wed, 01 Dec 2021 20:47:44 +0100
Aaron Jensen <aaronjensen <at> gmail.com> writes:

> Ultimately, it seems like it may be worth reconsidering this condition:
>
> (and old-pos (< (- pos old-pos)
>     ;; The time to use syntax-begin-function and
>     ;; find PPSS is assumed to be about 2 * distance.
>     (* 2 (/ (cdr (aref syntax-ppss-stats 5))
>     (1+ (car (aref syntax-ppss-stats 5)))))))

(I'm going through old bug reports that unfortunately weren't resolved
at the time.)

This bit is now:

	(if (and old-pos (< (- pos old-pos)
			    ;; The time to use syntax-begin-function and
			    ;; find PPSS is assumed to be about 2 * distance.
			    (let ((pair (aref syntax-ppss-stats 5)))
			      (/ (* 2 (cdr pair)) (car pair)))))

I.e., the last clause is gone.  I don't know whether this affects the
issue you were seeing, though.  Is syntax-ppss still mis-caching things
for you?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Added tag(s) moreinfo. Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Wed, 01 Dec 2021 19:48:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Fri, 03 Dec 2021 02:39:02 GMT) Full text and rfc822 format available.

Message #28 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 24048 <at> debbugs.gnu.org, Dmitry Gutov <dgutov <at> yandex.ru>
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Thu, 2 Dec 2021 21:38:07 -0500
On Wed, Dec 1, 2021 at 2:47 PM Lars Ingebrigtsen <larsi <at> gnus.org> wrote:
>
> Aaron Jensen <aaronjensen <at> gmail.com> writes:
>
> > Ultimately, it seems like it may be worth reconsidering this condition:
> >
> > (and old-pos (< (- pos old-pos)
> >     ;; The time to use syntax-begin-function and
> >     ;; find PPSS is assumed to be about 2 * distance.
> >     (* 2 (/ (cdr (aref syntax-ppss-stats 5))
> >     (1+ (car (aref syntax-ppss-stats 5)))))))
>
> (I'm going through old bug reports that unfortunately weren't resolved
> at the time.)
>
> This bit is now:
>
>         (if (and old-pos (< (- pos old-pos)
>                             ;; The time to use syntax-begin-function and
>                             ;; find PPSS is assumed to be about 2 * distance.
>                             (let ((pair (aref syntax-ppss-stats 5)))
>                               (/ (* 2 (cdr pair)) (car pair)))))
>
> I.e., the last clause is gone.  I don't know whether this affects the
> issue you were seeing, though.  Is syntax-ppss still mis-caching things
> for you?

I can still reproduce it with the specified repro:

Load https://gist.githubusercontent.com/aaronjensen/d4cd40347a916dd36c8239afecf64a7d/raw/b52440bb51b96193a365a7f4cc1c8733ba98476f/syntax-ppss-slow-repro.ex
Install and enable elixir-mode

At top of file:
M-: (benchmark 100 '(syntax-ppss))

On line 71:
M-: (benchmark 100 '(syntax-ppss))

For me it's 0.1ms vs 5ms

Aaron




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Fri, 03 Dec 2021 16:28:02 GMT) Full text and rfc822 format available.

Message #31 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: 24048 <at> debbugs.gnu.org, Stefan Monnier <monnier <at> iro.umontreal.ca>,
 Dmitry Gutov <dgutov <at> yandex.ru>
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Fri, 03 Dec 2021 17:26:50 +0100
Aaron Jensen <aaronjensen <at> gmail.com> writes:

> I can still reproduce it with the specified repro:
>
> Load
> https://gist.githubusercontent.com/aaronjensen/d4cd40347a916dd36c8239afecf64a7d/raw/b52440bb51b96193a365a7f4cc1c8733ba98476f/syntax-ppss-slow-repro.ex
> Install and enable elixir-mode
>
> At top of file:
> M-: (benchmark 100 '(syntax-ppss))
>
> On line 71:
> M-: (benchmark 100 '(syntax-ppss))
>
> For me it's 0.1ms vs 5ms

Thanks for checking.

Perhaps Stefan has some insights here; added to the CCs.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Fri, 03 Dec 2021 19:05:02 GMT) Full text and rfc822 format available.

Message #34 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Fri, 03 Dec 2021 12:01:41 -0500
> In certain situations, the caching of syntax-ppss can seem to be
> insufficient for good performance when syntax-ppss is invoked in
> a tight loop.

Yes, that's a known limitation.  Most uses of `syntax-ppss` that need to
call it in a tight loop move the call outside of the loop and then use
`parse-partial-sexp` inside the loop (and they're careful to move
forward so `parse-partial-sexp` is only called between the last
position and the current one so we avoid re-parsing the same text).

Currently `syntax-ppss` assumes that parsing <2500 chars is "fast
enough" and hence that it's better not to update the "last ppss data"
when this happens (the advantage is that we save time not-updating the
data and we also save time if the next call is somewhere within those
<2500 chars).


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Sat, 04 Dec 2021 01:33:02 GMT) Full text and rfc822 format available.

Message #37 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Fri, 3 Dec 2021 20:31:50 -0500
On Fri, Dec 3, 2021 at 2:04 PM Stefan Monnier <monnier <at> iro.umontreal.ca> wrote:
>
> > In certain situations, the caching of syntax-ppss can seem to be
> > insufficient for good performance when syntax-ppss is invoked in
> > a tight loop.
>
> Yes, that's a known limitation.  Most uses of `syntax-ppss` that need to
> call it in a tight loop move the call outside of the loop and then use
> `parse-partial-sexp` inside the loop (and they're careful to move
> forward so `parse-partial-sexp` is only called between the last
> position and the current one so we avoid re-parsing the same text).
>
> Currently `syntax-ppss` assumes that parsing <2500 chars is "fast
> enough" and hence that it's better not to update the "last ppss data"
> when this happens (the advantage is that we save time not-updating the
> data and we also save time if the next call is somewhere within those
> <2500 chars).

Copy that, thanks for the explanation. I'm not presently affected by
this (no smartparens and no elixir) so I'd be happy to close this
given that it's working as expected and there are clear ways to avoid
it in many cases.

Thanks,

Aaron




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Sat, 04 Dec 2021 02:42:02 GMT) Full text and rfc822 format available.

Message #40 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: Stefan Monnier <monnier <at> iro.umontreal.ca>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Sat, 04 Dec 2021 03:41:03 +0100
Aaron Jensen <aaronjensen <at> gmail.com> writes:

> Copy that, thanks for the explanation. I'm not presently affected by
> this (no smartparens and no elixir) so I'd be happy to close this
> given that it's working as expected and there are clear ways to avoid
> it in many cases.

OK; I'm closing this report, then.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




bug closed, send any further explanations to 24048 <at> debbugs.gnu.org and Aaron Jensen <aaronjensen <at> gmail.com> Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Sat, 04 Dec 2021 02:42:03 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Sat, 04 Dec 2021 14:42:02 GMT) Full text and rfc822 format available.

Message #45 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Dmitry Gutov <dgutov <at> yandex.ru>
To: Aaron Jensen <aaronjensen <at> gmail.com>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Sat, 4 Dec 2021 17:40:18 +0300
On 04.12.2021 04:31, Aaron Jensen wrote:
> I'm not presently affected by
> this (no smartparens and no elixir)

No Ruby either?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Sat, 04 Dec 2021 16:28:01 GMT) Full text and rfc822 format available.

Message #48 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Dmitry Gutov <dgutov <at> yandex.ru>
Cc: Stefan Monnier <monnier <at> iro.umontreal.ca>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Sat, 4 Dec 2021 11:27:09 -0500
On Sat, Dec 4, 2021 at 9:40 AM Dmitry Gutov <dgutov <at> yandex.ru> wrote:
>
> On 04.12.2021 04:31, Aaron Jensen wrote:
> > I'm not presently affected by
> > this (no smartparens and no elixir)
>
> No Ruby either?

I do use Ruby with enh-ruby-mode. I haven't noticed enough typing lag
for me to investigate. Why do you ask?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Sun, 05 Dec 2021 00:15:02 GMT) Full text and rfc822 format available.

Message #51 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Dmitry Gutov <dgutov <at> yandex.ru>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: Stefan Monnier <monnier <at> iro.umontreal.ca>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Sun, 5 Dec 2021 03:13:27 +0300
On 04.12.2021 19:27, Aaron Jensen wrote:
> On Sat, Dec 4, 2021 at 9:40 AM Dmitry Gutov <dgutov <at> yandex.ru> wrote:
>>
>> On 04.12.2021 04:31, Aaron Jensen wrote:
>>> I'm not presently affected by
>>> this (no smartparens and no elixir)
>>
>> No Ruby either?
> 
> I do use Ruby with enh-ruby-mode. I haven't noticed enough typing lag
> for me to investigate. Why do you ask?

You mentioned Ruby previously. If you had identified particular 
performance problems with ruby-mode, we could try to fix it there (even 
if there's not much to be done in syntax-ppss).

enh-ruby-mode is a different matter, though.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24048; Package emacs. (Sun, 05 Dec 2021 05:07:02 GMT) Full text and rfc822 format available.

Message #54 received at 24048 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Dmitry Gutov <dgutov <at> yandex.ru>
Cc: Stefan Monnier <monnier <at> iro.umontreal.ca>, 24048 <at> debbugs.gnu.org
Subject: Re: bug#24048: 25.0.95; syntax-ppss can be slow
Date: Sun, 5 Dec 2021 00:06:09 -0500
On Sat, Dec 4, 2021 at 7:14 PM Dmitry Gutov <dgutov <at> yandex.ru> wrote:
>
> On 04.12.2021 19:27, Aaron Jensen wrote:
> > On Sat, Dec 4, 2021 at 9:40 AM Dmitry Gutov <dgutov <at> yandex.ru> wrote:
> >>
> >> On 04.12.2021 04:31, Aaron Jensen wrote:
> >>> I'm not presently affected by
> >>> this (no smartparens and no elixir)
> >>
> >> No Ruby either?
> >
> > I do use Ruby with enh-ruby-mode. I haven't noticed enough typing lag
> > for me to investigate. Why do you ask?
>
> You mentioned Ruby previously. If you had identified particular
> performance problems with ruby-mode, we could try to fix it there (even
> if there's not much to be done in syntax-ppss).
>
> enh-ruby-mode is a different matter, though.

Ah. I don't have any cases right now, so I'm ok letting it go until
something comes up. I no longer understand enough about what's going
on in that function to even suggest an improvement, so if things are
working as expected and no one else is noticing a perf issue then I
think we are good.

Thanks,

Aaron




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 02 Jan 2022 12:24:06 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 76 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.