unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#55636: 27.2; etags performance fix when working with very big TAGS files
@ 2022-05-25 16:04 Jurgen De Backer via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-05-25 17:16 ` Eli Zaretskii
  0 siblings, 1 reply; 10+ messages in thread
From: Jurgen De Backer via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-05-25 16:04 UTC (permalink / raw)
  To: 55636; +Cc: jurgen.de-backer.ext, stef.van-vlierberghe, philippe.waroquiers


Hi,

We implemented a fix for making etags searching faster in our custom
emacs build.
In our project, sometimes a search could take more than 10 seconds.
The fix is to expand filenames only if they are relative:

(defun expand-if-relative (a-file)
(if (file-name-absolute-p a-file)
    a-file
  (expand-file-name a-file)
  )
)

and then use this function in the mapcar statement inside (defun
tags-table-including ...), replacing expand-file-name:
  ....
  (if (member this-file (mapcar #'expand-if-relative
                                          (tags-table-files)))
                ;; Found it.
                (setq found tables)
                )
  ....

Looking at expand-file-name doc, it does 2 things:
  * make file name absolute
  * and canonicalize it (removes the xxxx/.. dir components,
       the . dir components, the double slashes).

We are wondering if the standard C function in emacs could do
a fast "do nothing" when the file name is absolute and has
nothing to cannonicalize.
It could be useful to add this check in the emacs implementation of
expand-file-name.

Many thanks,
Jurgen De Backer



In GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30)
 of 2022-05-23 built on dhdevd14
Windowing system distributor 'Moba/X', version 11.0.12004000
System Description: Red Hat Enterprise Linux Server 7.9 (Maipo)

Recent messages:
Adding to TAGS-list: /cm/ot/TACT/TACT_CONFIG!27.0.0.33/build_G!27.IP.L7/TAGS.extra, to: (/cm/ot/TACT/TACT_CONFIG!27.0.0.33/build_G!27.IP.L7/TAGS /cm/ot/TACT/TACT_CONFIG!27.0.0.33/build_G!27.IP.L7/TAGS.extra)
Adding to TAGS-list: /cm/ot/CMA/MASTER.1/build_G!27.IP.L7/TAGS, to: (/cm/ot/CMA/MASTER.1/build_G!27.IP.L7/TAGS)
Adding to TAGS-list: /cm/ot/CMA/MASTER.1/build_G!27.IP.L7/TAGS.extra, to: (/cm/ot/CMA/MASTER.1/build_G!27.IP.L7/TAGS /cm/ot/CMA/MASTER.1/build_G!27.IP.L7/TAGS.extra)
Loading gpc...done
isearch-forwardisearch-backwardisearch-forward-regexpisearch-backward-regexpquery-replacequery-replace-regexpreplace-regexpreplace-string
Setup ispell to use hunspell
Loading version_emacs_startup...done
Loading ada_mode_6...done
Loading /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/emacs_startup.el (source)...done
For information about GNU Emacs and the GNU system, type C-h C-a.

Configured using:
 'configure
 --prefix=/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated
 --exec-prefix=/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/libexec/emacs-27.2
 --mandir=/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/man
 --with-x-toolkit=gtk3 --with-modules --with-xft
 'CFLAGS=-I/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/include
 ' 'LDFLAGS=-Wl,-rpath,/cfmu/local/data/libimagemagic
 -L/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/lib''

Configured features:
XPM JPEG TIFF GIF PNG SOUND GPM DBUS GSETTINGS GLIB NOTIFY INOTIFY ACL
LIBSELINUX GNUTLS LIBXML2 FREETYPE HARFBUZZ XFT ZLIB TOOLKIT_SCROLL_BARS
GTK3 X11 XDBE XIM MODULES THREADS PDUMPER

Important settings:
  value of $EMACSDATA: /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/etc
  value of $EMACSDOC: /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/etc
  value of $EMACSLOADPATH: /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp:/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/site-lisp:/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp
  value of $EMACSPATH: /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/libexec/emacs-27.2/libexec/emacs/27.2/x86_64-pc-linux-gnu:
  value of $LANG: C
  locale-coding-system: nil

Major mode: Lisp Interaction

Minor modes in effect:
  which-function-mode: t
  show-paren-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-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

Load-path shadows:
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/sh-script hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/progmodes/sh-script
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-groovy hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-groovy
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-lint hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-lint
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-texinfo hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-texinfo
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-beamer hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-beamer
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-sqlite hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-sqlite
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-makefile hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-makefile
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-latex hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-latex
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-tangle hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-tangle
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-entities hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-entities
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-clojure hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-clojure
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-table hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-table
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-capture hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-capture
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-indent hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-indent
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-feed hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-feed
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-plot hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-plot
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-list hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-list
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-keys hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-keys
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-emacs-lisp hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-emacs-lisp
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-latex hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-latex
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-duration hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-duration
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-faces hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-faces
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-table hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-table
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-agenda hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-agenda
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-macro hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-macro
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-protocol hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-protocol
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-plantuml hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-plantuml
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-screen hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-screen
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-compat hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-compat
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-processing hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-processing
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-octave hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-octave
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-crypt hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-crypt
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-timer hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-timer
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-ctags hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-ctags
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-maxima hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-maxima
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-lilypond hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-lilypond
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-element hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-element
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-matlab hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-matlab
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-gnuplot hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-gnuplot
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-forth hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-forth
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-archive hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-archive
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-datetree hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-datetree
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-mobile hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-mobile
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-ledger hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-ledger
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-eshell hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-eshell
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-asymptote hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-asymptote
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-macs hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-macs
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-attach-git hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-attach-git
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-lisp hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-lisp
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-lob hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-lob
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-R hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-R
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-vala hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-vala
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-odt hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-odt
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-footnote hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-footnote
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-icalendar hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-icalendar
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-lua hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-lua
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-habit hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-habit
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-css hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-css
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-core hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-core
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-exp hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-exp
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-comint hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-comint
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-ocaml hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-ocaml
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-id hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-id
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-abc hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-abc
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-org hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-org
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-info hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-info
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-sass hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-sass
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-shell hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-shell
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-scheme hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-scheme
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-haskell hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-haskell
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-bibtex hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-bibtex
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-rmail hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-rmail
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-java hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-java
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-md hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-md
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-sql hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-sql
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-src hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-src
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-mscgen hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-mscgen
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-C hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-C
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-eval hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-eval
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-eshell hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-eshell
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-eww hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-eww
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-gnus hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-gnus
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-awk hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-awk
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-goto hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-goto
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-mhe hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-mhe
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-inlinetask hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-inlinetask
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-ruby hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-ruby
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-org hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-org
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-publish hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-publish
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-bbdb hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-bbdb
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-num hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-num
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-calc hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-calc
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-irc hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-irc
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-shen hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-shen
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-colview hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-colview
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-attach hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-attach
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-ditaa hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-ditaa
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-dot hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-dot
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-hledger hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-hledger
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-J hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-J
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-w3m hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-w3m
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-python hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-python
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-io hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-io
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-ref hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-ref
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-clock hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-clock
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-fortran hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-fortran
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-mouse hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-mouse
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ol-docview hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ol-docview
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-install hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-install
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-loaddefs hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-loaddefs
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-picolisp hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-picolisp
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-ascii hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-ascii
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-version hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-version
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-man hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-man
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-sed hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-sed
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-js hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-js
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-pcomplete hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-pcomplete
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ox-html hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ox-html
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-stan hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-stan
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org-tempo hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org-tempo
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/org hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/org
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-coq hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-coq
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-perl hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-perl
/cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/26.3/site-lisp/org-9.3.1/ob-ebnf hides /cm/ot/TOOL/GNU!27.0.0.12/build_G!27.IP.L7/generated/share/emacs/27.2/lisp/org/ob-ebnf

Features:
(shadow sort mail-extr emacsbug message rmc puny rfc822 mml mml-sec epa
derived epg epg-config gnus-util rmail rmail-loaddefs
text-property-search mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
mm-util mail-prsvr mail-utils gpc dired dired-loaddefs mule-util etags
fileloop generator which-func ido paren ada-imenu imenu ada-skel
ada-skeletons skeleton ada-compiler ada-gnat-compile ada-gnat-xref
gnat-core ada-wisi ada-process wisi-process-parse
ada-indent-user-options ada-fix-error ada-mode wisi xref project
wisi-fringe wisi-parse-common semantic/lex semantic/fw mode-local
find-file compile align highlight-beyond-fill-column which-key vlf-setup
vlf vlf-base vlf-tune org ob ob-tangle ob-ref ob-lob ob-table ob-exp
org-macro org-footnote org-src ob-comint org-pcomplete pcomplete
org-list org-faces org-entities time-date noutline outline easy-mmode
org-version ob-emacs-lisp ob-core ob-eval org-table ol org-keys
org-compat advice org-macs org-loaddefs format-spec find-func cal-menu
calendar cal-loaddefs memory-usage ffap thingatpt comint ansi-color ring
jka-compr finder-inf package easymenu browse-url url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache json subr-x map url-vars seq byte-opt gv bytecomp
byte-compile cconv cl-loaddefs cl-lib tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame minibuffer 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 composite charscript charprop case-table epa-hook
jka-cmpr-hook help simple abbrev obarray 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 threads dbusbind inotify dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)

Memory information:
((conses 16 140306 18084)
 (symbols 48 16485 1)
 (strings 32 51083 2051)
 (string-bytes 1 1801019)
 (vectors 16 23936)
 (vector-slots 8 278494 10296)
 (floats 8 109 60)
 (intervals 56 906 91)
 (buffers 1000 11)
 (heap 1024 18287 1390))
____

This message and any files transmitted with it are legally privileged and intended for the sole use of the individual(s) or entity to whom they are addressed. If you are not the intended recipient, please notify the sender by reply and delete the message and any attachments from your system. Any unauthorised use or disclosure of the content of this message is strictly prohibited and may be unlawful.

Nothing in this e-mail message amounts to a contractual or legal commitment on the part of EUROCONTROL, unless it is confirmed by appropriately signed hard copy.

Any views expressed in this message are those of the sender.





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-25 16:04 bug#55636: 27.2; etags performance fix when working with very big TAGS files Jurgen De Backer via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-05-25 17:16 ` Eli Zaretskii
  2022-05-25 20:42   ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2022-05-25 17:16 UTC (permalink / raw)
  To: Jurgen De Backer; +Cc: 55636, stef.van-vlierberghe, philippe.waroquiers

> Cc: jurgen.de-backer.ext@eurocontrol.int, stef.van-vlierberghe@eurocontrol.int,
>  philippe.waroquiers@eurocontrol.int
> Date: Wed, 25 May 2022 16:04:04 +0000
> From:  Jurgen De Backer via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
> 
> We implemented a fix for making etags searching faster in our custom
> emacs build.
> In our project, sometimes a search could take more than 10 seconds.
> The fix is to expand filenames only if they are relative:
> 
> (defun expand-if-relative (a-file)
> (if (file-name-absolute-p a-file)
>     a-file
>   (expand-file-name a-file)
>   )
> )
> 
> and then use this function in the mapcar statement inside (defun
> tags-table-including ...), replacing expand-file-name:
>   ....
>   (if (member this-file (mapcar #'expand-if-relative
>                                           (tags-table-files)))
>                 ;; Found it.
>                 (setq found tables)
>                 )
>   ....

Thanks.  How much speedup does this bring in your use cases?  From 10
sec down to how long?

> Looking at expand-file-name doc, it does 2 things:
>   * make file name absolute
>   * and canonicalize it (removes the xxxx/.. dir components,
>        the . dir components, the double slashes).

It actually does more, like resolve the ~/ etc.

> We are wondering if the standard C function in emacs could do
> a fast "do nothing" when the file name is absolute and has
> nothing to cannonicalize.

I think testing for "nothing to canonicalize" is as complex as
canonicalizing the file name.





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-25 17:16 ` Eli Zaretskii
@ 2022-05-25 20:42   ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-05-26  5:07     ` Eli Zaretskii
  0 siblings, 1 reply; 10+ messages in thread
From: VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-05-25 20:42 UTC (permalink / raw)
  To: Eli Zaretskii, DE BACKER Jurgen (EXT)
  Cc: 55636@debbugs.gnu.org, WAROQUIERS Philippe

Hi Eli,

For us the 10 sec is reduced to below 1 sec, loading the tags file is no longer noticed after this change.

I assume the reason is a huge amount of files all accessed over NFS, and expand-file-name does a lot of system calls that translate into network packets.

An alternative approach is to add some switch that allows a customization that simply never calls the expand-file-name, we generate tags files that already contain absolute paths so don't need any of this logic and disabling it would also be ok for us.

All the best,
Stef

-----Original Message-----
From: Eli Zaretskii <eliz@gnu.org>
Sent: 25 May 2022 19:16
To: DE BACKER Jurgen (EXT) <jurgen.de-backer.ext@eurocontrol.int>
Cc: 55636@debbugs.gnu.org; VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>; WAROQUIERS Philippe <philippe.waroquiers@eurocontrol.int>
Subject: Re: bug#55636: 27.2; etags performance fix when working with very big TAGS files

> Cc: jurgen.de-backer.ext@eurocontrol.int,
> stef.van-vlierberghe@eurocontrol.int,
>  philippe.waroquiers@eurocontrol.int
> Date: Wed, 25 May 2022 16:04:04 +0000
> From:  Jurgen De Backer via "Bug reports for GNU Emacs,  the Swiss
> army knife of text editors" <bug-gnu-emacs@gnu.org>
>
> We implemented a fix for making etags searching faster in our custom
> emacs build.
> In our project, sometimes a search could take more than 10 seconds.
> The fix is to expand filenames only if they are relative:
>
> (defun expand-if-relative (a-file)
> (if (file-name-absolute-p a-file)
>     a-file
>   (expand-file-name a-file)
>   )
> )
>
> and then use this function in the mapcar statement inside (defun
> tags-table-including ...), replacing expand-file-name:
>   ....
>   (if (member this-file (mapcar #'expand-if-relative
>                                           (tags-table-files)))
>                 ;; Found it.
>                 (setq found tables)
>                 )
>   ....

Thanks.  How much speedup does this bring in your use cases?  From 10 sec down to how long?

> Looking at expand-file-name doc, it does 2 things:
>   * make file name absolute
>   * and canonicalize it (removes the xxxx/.. dir components,
>        the . dir components, the double slashes).

It actually does more, like resolve the ~/ etc.

> We are wondering if the standard C function in emacs could do a fast
> "do nothing" when the file name is absolute and has nothing to
> cannonicalize.

I think testing for "nothing to canonicalize" is as complex as canonicalizing the file name.
____

This message and any files transmitted with it are legally privileged and intended for the sole use of the individual(s) or entity to whom they are addressed. If you are not the intended recipient, please notify the sender by reply and delete the message and any attachments from your system. Any unauthorised use or disclosure of the content of this message is strictly prohibited and may be unlawful.

Nothing in this e-mail message amounts to a contractual or legal commitment on the part of EUROCONTROL, unless it is confirmed by appropriately signed hard copy.

Any views expressed in this message are those of the sender.





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-25 20:42   ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-05-26  5:07     ` Eli Zaretskii
  2022-05-26 13:50       ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2022-05-26  5:07 UTC (permalink / raw)
  To: VAN VLIERBERGHE Stef; +Cc: 55636, jurgen.de-backer.ext, philippe.waroquiers

> From: VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>
> CC: "55636@debbugs.gnu.org" <55636@debbugs.gnu.org>, WAROQUIERS Philippe
> 	<philippe.waroquiers@eurocontrol.int>
> Date: Wed, 25 May 2022 20:42:16 +0000
> 
> For us the 10 sec is reduced to below 1 sec, loading the tags file is no longer noticed after this change.
> 
> I assume the reason is a huge amount of files all accessed over NFS, and expand-file-name does a lot of system calls that translate into network packets.

Actually, expand-file-name is a purely syntactical function that is
supposed not to hit the filesystem at all, at l;east on Posix systems.
So I wonder why it seems to happen in your case.  Any chances that you
could show a trace of system calls for those 10 sec?

Of course, making a simple change that you suggested is a no-brainer,
so we might as well do it without further ado, but I'm just curious
and think maybe we will learn something useful if we dig a bit deeper
into your use case.

> An alternative approach is to add some switch that allows a customization that simply never calls the expand-file-name, we generate tags files that already contain absolute paths so don't need any of this logic and disabling it would also be ok for us.

That'd be less clean, I think: if we can do something automatically,
it's better to do that instead of placing the burden on the user.

Again, I'm not asking these questions because I see some problem in
your proposed change.  If we arrive at the conclusion that there's no
reason to investigate more, we can just install that change, as it
cannot possibly hurt.

Thanks.





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-26  5:07     ` Eli Zaretskii
@ 2022-05-26 13:50       ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-05-26 14:54         ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 10+ messages in thread
From: VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-05-26 13:50 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: 55636@debbugs.gnu.org, DE BACKER Jurgen (EXT),
	WAROQUIERS Philippe

You are right, I tried an strace and only see the tags files being read.

I also can't get the 10 sec behaviour any more, maybe some other factors were involved that made the emacs tag file processing slow.

What I did at the time to analyze was to enable debugger on Ctrl-G and then I notices emacs was busy here :

Debugger entered--Lisp error: (quit)
  expand-file-name(#("/cm/ot/TOOL/GTK!27.0.0.1/build_G!27.IP.L7/sources/..." 0 88 (charset iso-8859-1)))
  mapcar(expand-file-name (#("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 81 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 80 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 83 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 83 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) ...))
  tags-table-including("/tmp/vvl.Tstatus.out" t)
  visit-tags-table-buffer()
  find-tag-noselect("-tv_summary.adb" nil nil)

From that I concluded the expand-file-name was the cause.

Hope this helps and all the best,
Stef

-----Original Message-----
From: Eli Zaretskii <eliz@gnu.org>
Sent: 26 May 2022 07:07
To: VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>
Cc: DE BACKER Jurgen (EXT) <jurgen.de-backer.ext@eurocontrol.int>; 55636@debbugs.gnu.org; WAROQUIERS Philippe <philippe.waroquiers@eurocontrol.int>
Subject: Re: bug#55636: 27.2; etags performance fix when working with very big TAGS files

> From: VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>
> CC: "55636@debbugs.gnu.org" <55636@debbugs.gnu.org>, WAROQUIERS Philippe
> <philippe.waroquiers@eurocontrol.int>
> Date: Wed, 25 May 2022 20:42:16 +0000
>
> For us the 10 sec is reduced to below 1 sec, loading the tags file is no longer noticed after this change.
>
> I assume the reason is a huge amount of files all accessed over NFS, and expand-file-name does a lot of system calls that translate into network packets.

Actually, expand-file-name is a purely syntactical function that is supposed not to hit the filesystem at all, at l;east on Posix systems.
So I wonder why it seems to happen in your case.  Any chances that you could show a trace of system calls for those 10 sec?

Of course, making a simple change that you suggested is a no-brainer, so we might as well do it without further ado, but I'm just curious and think maybe we will learn something useful if we dig a bit deeper into your use case.

> An alternative approach is to add some switch that allows a customization that simply never calls the expand-file-name, we generate tags files that already contain absolute paths so don't need any of this logic and disabling it would also be ok for us.

That'd be less clean, I think: if we can do something automatically, it's better to do that instead of placing the burden on the user.

Again, I'm not asking these questions because I see some problem in your proposed change.  If we arrive at the conclusion that there's no reason to investigate more, we can just install that change, as it cannot possibly hurt.

Thanks.
____

This message and any files transmitted with it are legally privileged and intended for the sole use of the individual(s) or entity to whom they are addressed. If you are not the intended recipient, please notify the sender by reply and delete the message and any attachments from your system. Any unauthorised use or disclosure of the content of this message is strictly prohibited and may be unlawful.

Nothing in this e-mail message amounts to a contractual or legal commitment on the part of EUROCONTROL, unless it is confirmed by appropriately signed hard copy.

Any views expressed in this message are those of the sender.





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-26 13:50       ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-05-26 14:54         ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-05-26 15:09           ` Eli Zaretskii
  0 siblings, 1 reply; 10+ messages in thread
From: WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-05-26 14:54 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: 55636@debbugs.gnu.org, DE BACKER Jurgen (EXT),
	VAN VLIERBERGHE Stef


[-- Attachment #1.1: Type: text/plain, Size: 11618 bytes --]

Stef did his measurement in a context where the expand-file-name was not called

as the expand-if-relative optimisation was still active.



I have redone the measurements with expand-if-relative re-defined

as a simple call to expand-file-name.



With this, I have not observed a significant nr of file system access

when doing find-tag.



So, I think the problem is just the size our 4 TAGS files:

One is about 62 MB, 914_000 lines, of those lines, about 59_000 are file names lines,

another one  46 MB, 629_000 lines, also 59_000 file names lines.

We have 2 other smaller TAGS file (8MB and 9MB).



I have run emacs under valgrind --tool=callgrind.

valgrind points at expand-file-name eating significant cpu (see attachment).

I have also used the lisp profiler when loading the TAGS files.



- call-interactively                                           10141  84%

  - funcall-interactively                                       10077  84%

   - find-tag                                                   10069  83%

    - find-tag-noselect                                         10069  83%

     - visit-tags-table-buffer                                   9584  79%

      - tags-table-including                                     9578  79%

       - tags-table-extend-computed-list                         4327  36%

        - tags-verify-table                                      3274  27%

         - apply                                                 3274  27%

          - ad-Advice-tags-verify-table                          3274  27%

           + #<compiled 0x809ae9>                                3274  27%

        + tags-included-tables                                   1053   8%

       - mapcar                                                  4097  34%

          expand-if-relative                                     4076  34%

       + tags-table-files                                        1144   9%

      + tags-table-check-computed-list                              1   0%

      + tags-table-list-member                                      1   0%

     + find-tag-in-order                                          485   4%

   + execute-extended-command                                       8   0%

  + byte-code                                                      43   0%

  + find-tag-interactive                                           21   0%

+ ...                                                            1091   9%

+ redisplay_internal (C function)                                 735   6%

+ timer-event-handler                                              18   0%



Maybe this allows to points at what could be optimised ?



Note that as far as I can see,  the ad-Advice-tags-verify-table is created by our site lisp code containing vlf-1.7.1.

Not clear to me why this advice seems to be cpu costly, I was expecting this advice to only run a few times. i.e;

for each TAGS file opening.





Thanks

Philippe



> -----Original Message-----

> From: VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>

> Sent: 26 May 2022 15:51

> To: Eli Zaretskii <eliz@gnu.org>

> Cc: DE BACKER Jurgen (EXT) <jurgen.de-backer.ext@eurocontrol.int>; 55636@debbugs.gnu.org; WAROQUIERS Philippe

> <philippe.waroquiers@eurocontrol.int>

> Subject: RE: bug#55636: 27.2; etags performance fix when working with very big TAGS files

>

> You are right, I tried an strace and only see the tags files being read.

>

> I also can't get the 10 sec behaviour any more, maybe some other factors were involved that made the emacs tag file processing slow.

>

> What I did at the time to analyze was to enable debugger on Ctrl-G and then I notices emacs was busy here :

>

> Debugger entered--Lisp error: (quit)

>   expand-file-name(#("/cm/ot/TOOL/GTK!27.0.0.1/build_G!27.IP.L7/sources/..." 0 88 (charset iso-8859-1)))

>   mapcar(expand-file-name (#("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 81 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 80 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 83 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 83 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1))

> #("/cm/build9/cm/ot/TOOL/G!27.IP.L7/build_G!27.IP.L7/..." 0 82 (charset iso-8859-1)) ...))

>   tags-table-including("/tmp/vvl.Tstatus.out" t)

>   visit-tags-table-buffer()

>   find-tag-noselect("-tv_summary.adb" nil nil)

>

> From that I concluded the expand-file-name was the cause.

>

> Hope this helps and all the best,

> Stef

>

> -----Original Message-----

> From: Eli Zaretskii <eliz@gnu.org>

> Sent: 26 May 2022 07:07

> To: VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>

> Cc: DE BACKER Jurgen (EXT) <jurgen.de-backer.ext@eurocontrol.int>; 55636@debbugs.gnu.org; WAROQUIERS Philippe

> <philippe.waroquiers@eurocontrol.int>

> Subject: Re: bug#55636: 27.2; etags performance fix when working with very big TAGS files

>

> > From: VAN VLIERBERGHE Stef <stef.van-vlierberghe@eurocontrol.int>

> > CC: "55636@debbugs.gnu.org" <55636@debbugs.gnu.org>, WAROQUIERS Philippe

> >          <philippe.waroquiers@eurocontrol.int>

> > Date: Wed, 25 May 2022 20:42:16 +0000

> >

> > For us the 10 sec is reduced to below 1 sec, loading the tags file is no longer noticed after this change.

> >

> > I assume the reason is a huge amount of files all accessed over NFS, and expand-file-name does a lot of system calls that translate

> into network packets.

>

> Actually, expand-file-name is a purely syntactical function that is supposed not to hit the filesystem at all, at l;east on Posix systems.

> So I wonder why it seems to happen in your case.  Any chances that you could show a trace of system calls for those 10 sec?

>

> Of course, making a simple change that you suggested is a no-brainer, so we might as well do it without further ado, but I'm just

> curious and think maybe we will learn something useful if we dig a bit deeper into your use case.

>

> > An alternative approach is to add some switch that allows a customization that simply never calls the expand-file-name, we generate

> tags files that already contain absolute paths so don't need any of this logic and disabling it would also be ok for us.

>

> That'd be less clean, I think: if we can do something automatically, it's better to do that instead of placing the burden on the user.

>

> Again, I'm not asking these questions because I see some problem in your proposed change.  If we arrive at the conclusion that

> there's no reason to investigate more, we can just install that change, as it cannot possibly hurt.

>

> Thanks.

____

This message and any files transmitted with it are legally privileged and intended for the sole use of the individual(s) or entity to whom they are addressed. If you are not the intended recipient, please notify the sender by reply and delete the message and any attachments from your system. Any unauthorised use or disclosure of the content of this message is strictly prohibited and may be unlawful.

Nothing in this e-mail message amounts to a contractual or legal commitment on the part of EUROCONTROL, unless it is confirmed by appropriately signed hard copy.

Any views expressed in this message are those of the sender.

[-- Attachment #1.2: Type: text/html, Size: 27762 bytes --]

[-- Attachment #2: emacs_callgrind.png --]
[-- Type: image/png, Size: 163223 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-26 14:54         ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-05-26 15:09           ` Eli Zaretskii
  2022-05-26 17:25             ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2022-05-26 15:09 UTC (permalink / raw)
  To: WAROQUIERS Philippe; +Cc: 55636, jurgen.de-backer.ext, stef.van-vlierberghe

> From: WAROQUIERS Philippe <philippe.waroquiers@eurocontrol.int>
> CC: "DE BACKER Jurgen (EXT)" <jurgen.de-backer.ext@eurocontrol.int>,
> 	"55636@debbugs.gnu.org" <55636@debbugs.gnu.org>, VAN VLIERBERGHE Stef
> 	<stef.van-vlierberghe@eurocontrol.int>
> Date: Thu, 26 May 2022 14:54:04 +0000
> 
> So, I think the problem is just the size our 4 TAGS files:
> 
> One is about 62 MB, 914_000 lines, of those lines, about 59_000 are file names lines,
> another one  46 MB, 629_000 lines, also 59_000 file names lines.
> 
> We have 2 other smaller TAGS file (8MB and 9MB).
> 
> I have run emacs under valgrind --tool=callgrind.
> 
> valgrind points at expand-file-name eating significant cpu (see attachment).

I'm not sure I understand how to interpret that screenshot.

> I have also used the lisp profiler when loading the TAGS files.
> 
> 
> - call-interactively                                           10141  84%
>   - funcall-interactively                                       10077  84%
>    - find-tag                                                   10069  83%
>     - find-tag-noselect                                         10069  83%
>      - visit-tags-table-buffer                                   9584  79%
>       - tags-table-including                                     9578  79%
>        - tags-table-extend-computed-list                         4327  36%
>         - tags-verify-table                                      3274  27%
>          - apply                                                 3274  27%
>           - ad-Advice-tags-verify-table                          3274  27%

This says that most of the time is spent in tags-table-including.  If
you manually load etags.el (NOT .elc!), and then profile the same
operation, the profile could show in more detail which parts of
tags-table-including takes most of the time, and we can take it from
there.

Thanks.





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-26 15:09           ` Eli Zaretskii
@ 2022-05-26 17:25             ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-05-26 19:10               ` Eli Zaretskii
  0 siblings, 1 reply; 10+ messages in thread
From: WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-05-26 17:25 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: 55636@debbugs.gnu.org, DE BACKER Jurgen (EXT),
	VAN VLIERBERGHE Stef


[-- Attachment #1.1: Type: text/plain, Size: 6781 bytes --]

> > valgrind points at expand-file-name eating significant cpu (see attachment).

>

> I'm not sure I understand how to interpret that screenshot.

Each rectangle represents a function.

The nr inside the rectangle is the instructions used directly and indirectly by the function.

(direct cpu is spent in the function itself, indirect cpu is spend in the

called functions).



An arrow represents a call. The nr on the arrow represents the nr of calls.

So, what we can observe there is that the C function Fexpand_file_name makes 236_905 calls

to Ffind_File_name_handler

This Ffind_file_name_handler function makes 1.2 million calls to fast_string_match.



On this screenshot, we cannot see the CPU directly consumed by the functions,

but looking at the direct cpu shows that expand-file-name  cost is mostly due to the fast_string_match closure



(I have attached another screenshot as maybe  the fast search can be made faster.

E.g. it looks like builtin_lisp_symbol is called 213_000_000 times, is not inlined

while marked INLINE in the code or there are million of calls to maybe_quit inside re_match_2_internal).





> This says that most of the time is spent in tags-table-including.  If

> you manually load etags.el (NOT .elc!), and then profile the same

> operation, the profile could show in more detail which parts of

> tags-table-including takes most of the time, and we can take it from

> there.

Here is a more detailed lisp profile where I have expanded the costly branches.



- command-execute                                               10505  84%

- call-interactively                                           10504  84%

  - funcall-interactively                                       10327  83%

   - find-tag                                                   10316  82%

    - let*                                                      10316  82%

     - find-tag-noselect                                        10316  82%

      - let                                                     10316  82%

       - if                                                     10316  82%

        - if                                                     9832  79%

         - visit-tags-table-buffer                               9832  79%

          - cond                                                 9832  79%

           - setq                                                9831  79%

            - or                                                 9831  79%

             - and                                               9831  79%

              - save-current-buffer                              9831  79%

               - or                                              9831  79%

                - tags-table-including                           9831  79%

                 - let                                           9831  79%

                  - while                                        9831  79%

                   - if                                          9831  79%

                    - let                                        5399  43%

                     - if                                        5399  43%

                      - member                                   5396  43%

                       - mapcar                                  5384  43%

                        - tags-table-files                       1306  10%

                         - or                                    1306  10%

                          - setq                                 1306  10%

                           - funcall                             1306  10%

                            - etags-tags-table-files               1306  10%

                             + let                               1306  10%

                    - if                                         4432  35%

                     - tags-table-extend-computed-list               4432  35%

                      - let                                      4432  35%

                       - save-excursion                          4432  35%

                        - if                                     4432  35%

                         - tags-verify-table                     3292  26%

                          - apply                                3292  26%

                           - ad-Advice-tags-verify-table               3292  26%

                            + #<lambda 0x1b893daac4d25cc1>               3292  26%

                         - let                                   1140   9%

                          - tags-included-tables                 1140   9%

                           - or                                  1140   9%

                            - setq                               1140   9%

                             - funcall                           1140   9%

                              - etags-tags-included-tables               1140   9%

                               - let                             1140   9%

                                - while                          1126   9%

                                   if                              47   0%

                                   setq                            11   0%

           + tags-table-check-computed-list                         1   0%

        + let                                                     484   3%

   + execute-extended-command                                      11   0%

  + byte-code                                                     155   1%

  + find-tag-interactive                                           22   0%

+ ...                                                            1178   9%

+ redisplay_internal (C function)                                 730   5%

+ timer-event-handler                                              18   0%

  jit-lock--antiblink-post-command                                  1   0%



Thanks

Philippe

____

This message and any files transmitted with it are legally privileged and intended for the sole use of the individual(s) or entity to whom they are addressed. If you are not the intended recipient, please notify the sender by reply and delete the message and any attachments from your system. Any unauthorised use or disclosure of the content of this message is strictly prohibited and may be unlawful.

Nothing in this e-mail message amounts to a contractual or legal commitment on the part of EUROCONTROL, unless it is confirmed by appropriately signed hard copy.

Any views expressed in this message are those of the sender.

[-- Attachment #1.2: Type: text/html, Size: 32747 bytes --]

[-- Attachment #2: fast_string_match.png --]
[-- Type: image/png, Size: 221362 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-26 17:25             ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-05-26 19:10               ` Eli Zaretskii
  2022-05-26 20:45                 ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2022-05-26 19:10 UTC (permalink / raw)
  To: WAROQUIERS Philippe; +Cc: 55636, jurgen.de-backer.ext, stef.van-vlierberghe

> From: WAROQUIERS Philippe <philippe.waroquiers@eurocontrol.int>
> CC: "DE BACKER Jurgen (EXT)" <jurgen.de-backer.ext@eurocontrol.int>,
> 	"55636@debbugs.gnu.org" <55636@debbugs.gnu.org>, VAN VLIERBERGHE Stef
> 	<stef.van-vlierberghe@eurocontrol.int>
> Date: Thu, 26 May 2022 17:25:29 +0000
> 
> So, what we can observe there is that the C function Fexpand_file_name makes 236_905 calls
> 
> to Ffind_File_name_handler
> 
> This Ffind_file_name_handler function makes 1.2 million calls to fast_string_match.
> 
> 
> 
> On this screenshot, we cannot see the CPU directly consumed by the functions,
> 
> but looking at the direct cpu shows that expand-file-name  cost is mostly due to the fast_string_match closure

The Lisp profile tells quite a different story: according to that,
expand-file-name is not a hotspot.

So I still don't see  that expand-file-name is the place to optimize
your use case.

Did you succeed in reproducing the 10-sec delay with the original
code, and then ten-fold speedup if expand-file-name is called only on
non-absolute file names?





^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#55636: 27.2; etags performance fix when working with very big TAGS files
  2022-05-26 19:10               ` Eli Zaretskii
@ 2022-05-26 20:45                 ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 10+ messages in thread
From: WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-05-26 20:45 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: 55636@debbugs.gnu.org, DE BACKER Jurgen (EXT),
	VAN VLIERBERGHE Stef

> > So, what we can observe there is that the C function Fexpand_file_name makes 236_905 calls
> >
> > to Ffind_File_name_handler
> >
> > This Ffind_file_name_handler function makes 1.2 million calls to fast_string_match.
> >
> >
> >
> > On this screenshot, we cannot see the CPU directly consumed by the functions,
> >
> > but looking at the direct cpu shows that expand-file-name  cost is mostly due to the fast_string_match closure
>
> The Lisp profile tells quite a different story: according to that,
> expand-file-name is not a hotspot.
>
> So I still don't see  that expand-file-name is the place to optimize
> your use case.
>
> Did you succeed in reproducing the 10-sec delay with the original
> code, and then ten-fold speedup if expand-file-name is called only on
> non-absolute file names?

I have tried to reproduce the 10 seconds delay to no success.
With or without the expand-file-name called only on non absolute file names,
 I now see emacs always using about 4 seconds of cpu to load the TAGS files.

So, at this point:
   * I do not understand why we observed 3 different speed:
      sub-second, 4 seconds and 10 seconds
   * we now see that loading the TAGS files takes around 4 seconds, so is still a heavy
      operation that maybe could be optimised but not clear anymore what is the
      costly part.

Thanks
Philippe

____

This message and any files transmitted with it are legally privileged and intended for the sole use of the individual(s) or entity to whom they are addressed. If you are not the intended recipient, please notify the sender by reply and delete the message and any attachments from your system. Any unauthorised use or disclosure of the content of this message is strictly prohibited and may be unlawful.

Nothing in this e-mail message amounts to a contractual or legal commitment on the part of EUROCONTROL, unless it is confirmed by appropriately signed hard copy.

Any views expressed in this message are those of the sender.





^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-05-26 20:45 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-25 16:04 bug#55636: 27.2; etags performance fix when working with very big TAGS files Jurgen De Backer via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-25 17:16 ` Eli Zaretskii
2022-05-25 20:42   ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-26  5:07     ` Eli Zaretskii
2022-05-26 13:50       ` VAN VLIERBERGHE Stef via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-26 14:54         ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-26 15:09           ` Eli Zaretskii
2022-05-26 17:25             ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-26 19:10               ` Eli Zaretskii
2022-05-26 20:45                 ` WAROQUIERS Philippe via Bug reports for GNU Emacs, the Swiss army knife of text editors

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).