Package: emacs;
Reported by: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com>
Date: Sat, 23 Dec 2023 03:04:02 UTC
Severity: wishlist
To reply to this bug, email your comments to 67981 AT debbugs.gnu.org.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-gnu-emacs <at> gnu.org
:bug#67981
; Package emacs
.
(Sat, 23 Dec 2023 03:04:02 GMT) Full text and rfc822 format available.Karthik Chikmagalur <karthikchikmagalur <at> gmail.com>
:bug-gnu-emacs <at> gnu.org
.
(Sat, 23 Dec 2023 03:04:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com> To: bug-gnu-emacs <at> gnu.org Subject: Poor shr performance on text-only webpage Date: Fri, 22 Dec 2023 19:02:59 -0800
[Message part 1 (text/plain, inline)]
The function shr-descend (part of shr.el) performs very poorly when rendering web pages. This is not noticeable for small documents, but when loading https://orgmode.org/manual.html, it locks up Emacs for 10+ seconds at 100% CPU utilization on one core. In comparison, it loads in 2-3 seconds in Firefox without a CPU spike. (I have a reasonably fast three year old laptop.) --8<---------------cut here---------------start------------->8--- ;; -*- lexical-binding: t; -*- (let ((now (float-time))) (add-hook 'eww-after-render-hook (lambda () (message "EWW took %f seconds" (- (float-time) now)))) (eww "https://orgmode.org/org.html")) ;; => EWW took 10.606935 seconds --8<---------------cut here---------------end--------------->8--- Note that the above link is a long text only page with little to no CSS and no Javascript. I did some profiling to see what is slowing it down. If I'm reading the profile correctly, - About 240,587,126,505 bytes (240 GB) of memory are allocated, and almost all of it is split evenly between shr-render-td and shr-render-td-1. - about 54% of the the rendering time (10+ seconds) is spent in shr-descend, split between shr-tag-table and shr-tag-div. - About 35% of the time is spent doing GC. Is there some reason it's this slow and allocates so much memory? The only thing I noticed is that shr-descend and shr-render-td both use intern a lot, perhaps that's one source of the allocation? If you would like me to try something specific, I can give it a shot. Please let me know. The CPU and memory profiles are attached, and can be loaded with M-x profiler-find-profile. The test was run in `emacs -q'. Karthik In GNU Emacs 29.1 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo version 1.16.0, Xaw3d scroll bars) Windowing system distributor 'The X.Org Foundation', version 11.0.12101009 System Description: NixOS 23.05 (Stoat) Configured using: 'configure --prefix=/nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1 --disable-build-details --with-modules --with-x-toolkit=lucid --with-xft --with-cairo --with-native-compilation --with-tree-sitter --with-xinput2' Configured features: CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XAW3D XDBE XIM XPM LUCID ZLIB Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Fundamental Minor modes in effect: tooltip-mode: t global-eldoc-mode: t show-paren-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 blink-cursor-mode: t buffer-read-only: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /home/karthik/.nix-profile/share/emacs/site-lisp/site-start hides /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/site-lisp/site-start /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/emacs-lisp/let-alist hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/let-alist-1.0.6/let-alist /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-lua hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-lua /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-texinfo hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-texinfo /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-clock hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-clock /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-entities hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-entities /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-odt hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-odt /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-num hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-num /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-docview hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-docview /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-inlinetask hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-inlinetask /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-clojure hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-clojure /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-java hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-java /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-sass hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-sass /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-footnote hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-footnote /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-bbdb hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-bbdb /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-sed hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-sed /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-js hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-js /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-ref hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-ref /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-info hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-info /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-gnus hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-gnus /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-mobile hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-mobile /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-eshell hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-eshell /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-feed hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-feed /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-lint hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-lint /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-man hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-man /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-koma-letter hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-koma-letter /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-eval hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-eval /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-id hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-id /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-faces hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-faces /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-forth hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-forth /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-attach-git hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-attach-git /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-irc hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-irc /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-mhe hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-mhe /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-md hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-md /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-html hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-html /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-shell hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-shell /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/oc-biblatex hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/oc-biblatex /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-protocol hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-protocol /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-cycle hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-cycle /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-latex hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-latex /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-ctags hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-ctags /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-habit hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-habit /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-maxima hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-maxima /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-eww hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-eww /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-processing hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-processing /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-R hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-R /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-archive hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-archive /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-timer hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-timer /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-sqlite hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-sqlite /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-groovy hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-groovy /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-doi hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-doi /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-scheme hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-scheme /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-matlab hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-matlab /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-mouse hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-mouse /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-compat hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-compat /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-css hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-css /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-ascii hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-ascii /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-datetree hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-datetree /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-julia hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-julia /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/oc-natbib hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/oc-natbib /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-awk hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-awk /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-macro hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-macro /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-ditaa hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-ditaa /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-icalendar hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-icalendar /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-eshell hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-eshell /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-indent hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-indent /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-pcomplete hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-pcomplete /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-haskell hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-haskell /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/oc-basic hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/oc-basic /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-makefile hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-makefile /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-ruby hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-ruby /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-sql hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-sql /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-src hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-src /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-bibtex hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-bibtex /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-publish hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-publish /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-refile hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-refile /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-crypt hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-crypt /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-python hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-python /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-attach hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-attach /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-lilypond hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-lilypond /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-comint hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-comint /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-calc hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-calc /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-dot hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-dot /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-screen hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-screen /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/oc-csl hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/oc-csl /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-C hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-C /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-ocaml hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-ocaml /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-w3m hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-w3m /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ol-rmail hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ol-rmail /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-gnuplot hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-gnuplot /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-version hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-version /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-persist hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-persist /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-loaddefs hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-loaddefs /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-beamer hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-beamer /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-list hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-list /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-element hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-element /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-latex hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-latex /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-keys hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-keys /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-goto hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-goto /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-macs hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-macs /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-agenda hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-agenda /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-man hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-man /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-plantuml hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-plantuml /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-colview hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-colview /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-tangle hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-tangle /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-octave hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-octave /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-capture hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-capture /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-fold-core hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-fold-core /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-emacs-lisp hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-emacs-lisp /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-table hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-table /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-tempo hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-tempo /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-lob hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-lob /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ox-org hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ox-org /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-fortran hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-fortran /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-org hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-org /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-plot hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-plot /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/oc-bibtex hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/oc-bibtex /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-fold hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-fold /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-perl hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-perl /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-duration hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-duration /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-exp hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-exp /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/org-table hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/org-table /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/oc hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/oc /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-core hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-core /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/org/ob-lisp hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/org-9.6.6/ob-lisp /nix/store/hxzlg5ydvndk1n4ajcsnzj8g9b8yf93g-emacs-29.1/share/emacs/29.1/lisp/transient hides /home/karthik/.nix-profile/share/emacs/site-lisp/elpa/transient-20230602.2121/transient Features: (shadow sort mail-extr emacsbug message mailcap yank-media puny dired dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068 epg-config gnus-util text-property-search time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs comp comp-cstr warnings icons subr-x rx cl-seq cl-macs gv cl-extra help-mode bytecomp byte-compile cl-lib sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode 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 lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine 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 emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify dynamic-setting system-font-setting font-render-setting cairo x-toolkit x multi-tty make-network-process native-compile emacs) Memory information: ((conses 16 80574 10107) (symbols 48 7212 0) (strings 32 20748 1634) (string-bytes 1 675308) (vectors 16 15789) (vector-slots 8 330368 14645) (floats 8 29 46) (intervals 56 357 0) (buffers 984 12))
[shr-descend-original-profile-memory (application/octet-stream, attachment)]
[shr-descend-original-profile-cpu (application/octet-stream, attachment)]
bug-gnu-emacs <at> gnu.org
:bug#67981
; Package emacs
.
(Sat, 23 Dec 2023 08:14:01 GMT) Full text and rfc822 format available.Message #8 received at 67981 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com> Cc: 67981 <at> debbugs.gnu.org Subject: Re: bug#67981: Poor shr performance on text-only webpage Date: Sat, 23 Dec 2023 10:12:50 +0200
> From: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com> > Date: Fri, 22 Dec 2023 19:02:59 -0800 > > The function shr-descend (part of shr.el) performs very poorly when > rendering web pages. This is not noticeable for small documents, but > when loading https://orgmode.org/manual.html, it locks up Emacs for > 10+ seconds at 100% CPU utilization on one core. In comparison, it > loads in 2-3 seconds in Firefox without a CPU spike. (I have a > reasonably fast three year old laptop.) > > --8<---------------cut here---------------start------------->8--- > ;; -*- lexical-binding: t; -*- > > (let ((now (float-time))) > (add-hook 'eww-after-render-hook > (lambda () > (message "EWW took %f seconds" (- (float-time) now)))) > (eww "https://orgmode.org/org.html")) > > ;; => EWW took 10.606935 seconds > --8<---------------cut here---------------end--------------->8--- > > Note that the above link is a long text only page with little to no CSS > and no Javascript. > > I did some profiling to see what is slowing it down. If I'm reading > the profile correctly, The "memory" profile is not interesting if your system can produce the "cpu" profile. I attach a fully expanded "cpu" profile below. > - About 240,587,126,505 bytes (240 GB) of memory are allocated, and > almost all of it is split evenly between shr-render-td and > shr-render-td-1. I don't think it's interesting to look at the "memory" profile counts. Emacs allocates memory a lot, but the counts you see don't tell you which parts are immediately freed (e.g., used within a single function as temporary storage, and freed before the function returns). Also, most of that memory is not Lisp memory, i.e. not for Lisp objects. > - about 54% of the the rendering time (10+ seconds) is spent in > shr-descend, split between shr-tag-table and shr-tag-div. > > - About 35% of the time is spent doing GC. > > Is there some reason it's this slow and allocates so much memory? The > only thing I noticed is that shr-descend and shr-render-td both use > intern a lot, perhaps that's one source of the allocation? I'm not sure allocation of Lisp memory can be avoided, the way shr.el works. Rendering 23K lines of HTML does require to cons a lot of Lisp objects. You can slash the time a little by making the following customizations: (setopt textsec-check nil) (setopt shr-use-fonts nil) Here's the profile in human-readable format. Looking at it, I don't see how we could speed this up considerably. Ideas and patches welcome. 2837 50% - ... 2837 50% Automatic GC 2760 49% - url-http-generic-filter 2760 49% - url-http-chunked-encoding-after-change-function 2759 49% - url-http-activate-callback 2759 49% - apply 2759 49% - eww-render 2759 49% - let* 2759 49% - unwind-protect 2759 49% - progn 2759 49% - cond 2759 49% - eww-display-html 2759 49% - let 2691 47% - save-current-buffer 2688 47% - let 2688 47% - funcall-with-delayed-message 2688 47% - #<lambda 0x73cd2989dcfe> 2688 47% - shr-insert-document 2688 47% - let 2688 47% - unwind-protect 2688 47% - progn 2637 47% - shr-fill-lines 2637 47% - if 2637 47% - save-restriction 2635 46% - while 2629 46% - if 2629 46% - progn 2629 46% - shr-fill-line 2629 46% - let 2321 41% - let 2312 41% - if 2312 41% - progn 2312 41% - put-text-property 2311 41% - shr-face-background 2311 41% - and 2311 41% - or 2311 41% - let 2311 41% - let 2311 41% - while 2311 41% - let 2311 41% - if 2310 41% - shr-descend 2310 41% - let 2310 41% - if 2310 41% - cond 2310 41% - funcall 2071 36% - shr-tag-h5 2071 36% - shr-heading 2071 36% - apply 2071 36% - shr-fontize-dom 2071 36% - let 2070 36% - shr-generic 2070 36% - let 2070 36% - while 2070 36% - let 2070 36% - if 2070 36% - shr-descend 2070 36% - let 2070 36% - if 2070 36% - cond 2040 36% - funcall 1968 35% - shr-tag-table 1967 35% - let* 1967 35% - if 1944 34% - if 1944 34% - let 1941 34% - shr-tag-table-1 1941 34% - let* 1739 30% - or 1739 30% - shr-make-table 1739 30% - or 1739 30% - let 1739 30% - shr-make-table-1 1739 30% - let 1739 30% - let 1739 30% - while 1739 30% - let 1739 30% - if 1739 30% - progn 1737 30% - let 1736 30% - while 1734 30% - if 1731 30% - progn 1724 30% - if 1720 30% - progn 1718 30% - let 1712 30% - shr-render-td 1707 30% - let 1682 29% - or 1642 29% - let* 1636 29% - shr-render-td-1 1635 29% - let 1599 28% - save-current-buffer 1598 28% - unwind-protect 1561 27% - progn 1557 27% - let 1516 27% - let 1025 18% - shr-descend 1018 18% - let 1014 18% - if 1005 17% - cond 1003 17% - shr-generic 1002 17% - let 1002 17% - while 1002 17% - let 1001 17% - if 994 17% - shr-descend 993 17% - let 984 17% - if 981 17% - cond 981 17% - funcall 979 17% - eww-tag-a 977 17% - let 945 16% - shr-tag-a 944 16% - let 862 15% - if 862 15% - progn 628 11% - let* 626 11% - and 624 11% - or 623 11% - textsec-suspicious-p 349 6% - textsec-url-suspicious-p 246 4% - textsec-domain-suspicious-p 185 3% - textsec-ascii-confusable-p 185 3% - textsec-restriction-level 170 3% - textsec-covering-scripts 73 1% - seq-union 53 0% - seq-reduce 27 0% - seq-do 25 0% - mapc 18 0% - #<compiled -0x1c81e23f96f80b01> 14 0% - #<compiled -0x54db5cc1ce55b54> 10 0% - seq-contains-p 1 0% seq-do 14 0% - seq-empty-p 4 0% apply 72 1% - seq-difference 44 0% - seq-reduce 30 0% - seq-do 28 0% - mapc 23 0% - #<compiled -0x1cedde8780de0b01> 21 0% - #<compiled -0x54da0d04063ff54> 15 0% - seq-contains-p 6 0% - seq-do 4 0% - mapc 2 0% #<compiled -0x1dff8a621eb643fa> 4 0% - seq-empty-p 1 0% apply 11 0% - seq-reverse 5 0% - apply 4 0% #<compiled -0x47b1d72b2461ccc> 14 0% - textsec-scripts 14 0% - seq-map 10 0% - apply 8 0% - #<compiled 0x184c52027f5d6bf4> 7 0% mapcar 30 0% - puny-highly-restrictive-domain-p 18 0% - seq-every-p 16 0% - seq-do 16 0% - mapc 15 0% - #<compiled -0x7437d996da07cda> 14 0% - puny-highly-restrictive-string-p 9 0% - seq-map 9 0% - apply 9 0% - #<compiled 0x184c52027f5d6bf4> 8 0% mapcar 4 0% - seq-uniq 4 0% apply 5 0% split-string 16 0% textsec--ipvx-address-p 5 0% split-string 5 0% - seq-do 4 0% mapc 74 1% - url-generic-parse-url 37 0% - #<compiled -0x1dfea4210cf1bf87> 7 0% - kill-buffer 6 0% - replace-buffer-in-windows 1 0% unrecord-window-buffer 14 0% generate-new-buffer 194 3% - textsec-link-suspicious-p 135 2% - url-generic-parse-url 76 1% - #<compiled -0x1dfea5121584ff87> 16 0% - kill-buffer 15 0% - replace-buffer-in-windows 4 0% - unrecord-window-buffer 2 0% assq-delete-all 23 0% generate-new-buffer 5 0% - string-trim 2 0% string-trim-right 1 0% string-trim-left 1 0% - textsec-domain-suspicious-p 1 0% - textsec-ascii-confusable-p 1 0% - textsec-restriction-level 1 0% - textsec-covering-scripts 1 0% - seq-difference 1 0% - seq-reduce 1 0% - seq-do 1 0% - mapc 1 0% - #<compiled -0x1cedde8780de0b01> 1 0% - #<compiled -0x54da0d04063ff54> 1 0% seq-contains-p 25 0% - cons 15 0% - shr-expand-url 8 0% - if 6 0% - progn 6 0% - setq 6 0% - string-trim 2 0% string-trim-left 2 0% string-trim-right 1 0% = 4 0% - cond 1 0% concat 1 0% = 22 0% - require 21 0% - byte-code 19 0% - require 12 0% - byte-code 12 0% - ucs-normalize-make-translation-table-from-alist 2 0% make-translation-table-from-alist 4 0% - load-with-code-conversion 3 0% eval-buffer 1 0% - hack-read-symbol-shorthands 1 0% hack-local-variables--find-variables 1 0% - require 1 0% load-with-code-conversion 18 0% - shr-expand-url 11 0% - if 10 0% - progn 10 0% - setq 10 0% - string-trim 8 0% string-trim-right 1 0% = 5 0% - cond 3 0% - or 1 0% string-match-p 1 0% = 1 0% eq 231 4% - shr-urlify 152 2% - add-text-properties 150 2% - list 145 2% - let 84 1% - url-generic-parse-url 24 0% - #<compiled -0x1dfea5bf967ff787> 3 0% - kill-buffer 2 0% - replace-buffer-in-windows 2 0% - unrecord-window-buffer 1 0% assq-delete-all 19 0% - or 16 0% - condition-case 16 0% - progn 15 0% - decode-coding-string 13 0% url-unhex-string 13 0% generate-new-buffer 19 0% - if 19 0% - progn 17 0% - progn 14 0% - let* 13 0% - aset 10 0% - puny-encode-domain 3 0% - progn 3 0% - or 3 0% - progn 2 0% - and 1 0% memq 2 0% - or 1 0% - progn 1 0% and 1 0% - or 1 0% progn 7 0% - setq 1 0% url-recreate-url 30 0% - funcall 14 0% - eww--transform-url 14 0% - if 14 0% - progn 14 0% - let 14 0% - while 13 0% - let 12 0% - setq 11 0% - funcall 11 0% - eww-remove-tracking 10 0% replace-regexp-in-string 14 0% - shr-expand-url 12 0% - if 10 0% - progn 8 0% - setq 8 0% - string-trim 5 0% string-trim-right 2 0% - cond 1 0% - or 1 0% string-match-p 19 0% - shr-add-font 16 0% - save-excursion 14 0% - while 5 0% - if 4 0% < 4 0% - add-face-text-property 4 0% min 12 0% - while 8 0% - let 5 0% - if 1 0% put-text-property 1 0% next-single-property-change 8 0% - if 7 0% - progn 1 0% add-text-properties 1 0% < 80 1% - shr-generic 79 1% - let 78 1% - while 74 1% - let 74 1% - if 67 1% - shr-insert 64 1% - cond 63 1% - let 49 0% - let 31 0% - save-restriction 10 0% - shr--translate-insertion-chars 8 0% while 1 0% goto-char 9 0% while 6 0% - if 2 0% progn 1 0% goto-char 4 0% - if 4 0% - if 4 0% - progn 1 0% put-text-property 8 0% - if 4 0% progn 3 0% - and 3 0% string-match-p 2 0% - if 2 0% - and 1 0% not 1 0% get-text-property 7 0% - shr-descend 7 0% - let 5 0% - if 3 0% - or 1 0% - equal 1 0% cdr 1 0% - cond 1 0% funcall 1 0% - intern 1 0% - concat 1 0% symbol-name 1 0% cdr 1 0% - cdr 1 0% assq 1 0% - let* 1 0% - and 1 0% - and 1 0% not 31 0% - if 28 0% - put-text-property 28 0% - if 14 0% mm-images-in-region-p 2 0% - eww-handle-link 2 0% - let* 1 0% cdr 1 0% - eww-tag-meta 1 0% - if 1 0% and 2 0% - or 2 0% - equal 2 0% cdr 6 0% - intern 1 0% concat 1 0% cdr 4 0% - shr-insert 4 0% - cond 3 0% - let 2 0% - let 1 0% - save-restriction 1 0% if 3 0% - let* 2 0% - and 2 0% - cdr 2 0% assq 2 0% - or 1 0% equal 476 8% - unwind-protect 351 6% - progn 266 4% - if 178 3% - let 130 2% - shr-fill-lines 130 2% - if 129 2% - save-restriction 123 2% - if 123 2% - progn 122 2% - shr-fill-line 122 2% - let 115 2% - if 114 2% - progn 94 1% - shr-vertical-motion 94 1% - if 1 0% if 18 0% - while 12 0% - shr-vertical-motion 12 0% - if 1 0% vertical-motion 6 0% - if 5 0% - or 5 0% - not 1 0% pixel-fill-find-fill-point 1 0% - progn 1 0% delete-char 2 0% if 2 0% - let 1 0% - if 1 0% - progn 1 0% put-text-property 1 0% - or 1 0% get-text-property 3 0% - while 2 0% setq 1 0% - if 1 0% - progn 1 0% - shr-fill-line 1 0% - let 1 0% - if 1 0% - progn 1 0% - shr-vertical-motion 1 0% if 48 0% - setq 47 0% - shr-pixel-buffer-width 47 0% - if 47 0% - if 44 0% car 87 1% - setq 85 1% - or 84 1% - let 80 1% - max 70 1% - shr-pixel-buffer-width 70 1% - if 70 1% - if 69 1% car 9 0% - shr-dom-max-natural-width 9 0% - if 6 0% - let 5 0% - while 4 0% - let 3 0% - if 3 0% - setq 3 0% - max 3 0% - shr-dom-max-natural-width 3 0% - if 3 0% - let 3 0% - while 3 0% - let 1 0% setq 2 0% eq 2 0% dom-set-attribute 1 0% and 12 0% - set-window-buffer 10 0% - record-window-buffer 2 0% push-window-buffer-onto-prev 59 1% - set-window-configuration 56 0% - frame-windows-min-size 53 0% - window-min-size 36 0% - window--min-size-1 16 0% - window-size-fixed-p 7 0% - window--size-fixed-1 3 0% - window--preserve-size 3 0% window-preserved-size 2 0% window-child 1 0% window-normalize-window 1 0% window-child 1 0% - window-safe-min-size 1 0% window-normalize-window 23 0% - list 13 0% split-string 2 0% - if 2 0% - cdr 2 0% assq 1 0% count-lines 5 0% - shr--set-target-ids 5 0% - if 3 0% - let 2 0% seq-group-by 4 0% - cdr 4 0% assq 1 0% - delete-region 1 0% progn 37 0% - and 11 0% - kill-buffer 10 0% - replace-buffer-in-windows 3 0% - unrecord-window-buffer 3 0% - assq-delete-all 1 0% assoc-delete-all 19 0% generate-new-buffer 2 0% dom-set-attribute 38 0% - and 35 0% - let 34 0% - let 34 0% - while 32 0% - let 24 0% - let 19 0% - if 5 0% - progn 5 0% - let 3 0% - if 2 0% and 2 0% string-to-number 1 0% symbol-name 1 0% setq 25 0% intern 3 0% - if 1 0% and 1 0% - if 1 0% - setq 1 0% cons 2 0% - setq 1 0% cdr 1 0% >= 2 0% - let* 2 0% - and 2 0% - cdr 1 0% assq 1 0% setq 1 0% progn 1 0% - and 1 0% not 1 0% - setq 1 0% if 175 3% - shr-insert-table 158 2% - let* 158 2% - let 158 2% - while 158 2% - let 158 2% - let 158 2% - let 155 2% - while 154 2% - let 126 2% - if 125 2% - progn 119 2% - let 113 2% - let 111 1% - while 111 1% - let 107 1% - let 5 0% - and 4 0% - shr-face-background 4 0% - and 4 0% - or 3 0% - let 3 0% - let 3 0% - while 2 0% - let 1 0% setq 4 0% - shr-colorize-region 1 0% - if 1 0% and 1 0% 1- 2 0% propertize 2 0% - 4 0% - while 3 0% - let 2 0% - if 1 0% progn 1 0% - shr-indent 1 0% - if 1 0% - progn 1 0% if 1 0% > 3 0% - let 3 0% while 17 0% - shr-make-table 17 0% - or 17 0% - let 17 0% - shr-make-table-1 17 0% - let 17 0% - let 17 0% - while 17 0% - let 16 0% - if 14 0% - progn 13 0% - let 12 0% - while 8 0% - if 7 0% - progn 2 0% progn 2 0% if 1 0% setq 1 0% and 3 0% - setq 3 0% - if 1 0% = 1 0% car-safe 2 0% eq 16 0% - shr-column-specs 16 0% - let 10 0% - make-vector 10 0% - shr-max-columns 10 0% - let 10 0% - let 10 0% - while 9 0% - let 8 0% - if 8 0% - progn 8 0% - let 6 0% - while 6 0% - let 4 0% - if 3 0% - progn 2 0% - let* 1 0% and 1 0% - and 1 0% memq 6 0% - let 6 0% - while 6 0% - let 6 0% - if 6 0% - progn 6 0% - let 6 0% - let 5 0% - while 3 0% - let 2 0% - if 1 0% memq 1 0% - progn 1 0% - let 1 0% - cdr 1 0% assq 8 0% - shr-table-widths 8 0% - let* 8 0% - let 8 0% - while 8 0% - let 7 0% - let 5 0% - let 5 0% - while 1 0% let 3 0% - let* 3 0% - while 2 0% - setq 1 0% - cons 1 0% mapcar 3 0% - shr--fix-table 3 0% - let* 3 0% - dom-non-text-children 3 0% - shr--fix-tbody 2 0% - shr-table-body 2 0% - let 2 0% - seq-filter 1 0% - function 1 0% - cconv-make-interpreted-closure 1 0% - cconv-fv 1 0% - cconv-analyze-form 1 0% - cconv--analyze-function 1 0% - cconv-analyze-form 1 0% #<compiled -0xdb6d8de38021a78> 1 0% - seq-map 1 0% - apply 1 0% - #<compiled 0x184c52027f5d6bf4> 1 0% - mapcar 1 0% #<compiled 0x91ffdf39c9e7756> 1 0% - nconc 1 0% - let* 1 0% - while 1 0% setq 23 0% - let* 23 0% - if 23 0% - progn 23 0% - let 23 0% - shr-collect-extra-strings-in-table 23 0% - let* 23 0% - while 23 0% - if 23 0% - progn 23 0% - setq 23 0% - nconc 23 0% - reverse 23 0% - shr-collect-extra-strings-in-table 21 0% - let* 20 0% - while 15 0% - if 15 0% - progn 15 0% - setq 15 0% - nconc 14 0% - reverse 14 0% - shr-collect-extra-strings-in-table 11 0% - let* 10 0% - while 8 0% - if 8 0% - if 8 0% - progn 7 0% - if 5 0% - if 4 0% - if 3 0% - if 1 0% - if 1 0% memq 1 0% memq 1 0% setq 1 0% setq 1 0% - shr-ensure-paragraph 1 0% - if 1 0% - let 1 0% - cond 1 0% and 62 1% - shr-tag-dl 61 1% - shr-generic 61 1% - let 61 1% - while 61 1% - let 61 1% - if 46 0% - shr-descend 46 0% - let 46 0% - if 46 0% - cond 46 0% - funcall 33 0% - shr-tag-dt 25 0% - shr-generic 25 0% - let 25 0% - while 23 0% - let 23 0% - if 18 0% - shr-descend 16 0% - let 15 0% - if 13 0% - cond 13 0% - funcall 13 0% - shr-tag-span 13 0% - shr-generic 13 0% - let 13 0% - while 13 0% - let 12 0% - if 7 0% - shr-descend 6 0% - let 6 0% - if 4 0% - cond 4 0% - funcall 4 0% - eww-tag-a 3 0% - let 2 0% - shr-tag-a 2 0% let 1 0% if 1 0% eww-handle-link 1 0% - let* 1 0% - and 1 0% - cdr 1 0% assq 5 0% - shr-insert 5 0% - cond 5 0% - let 4 0% - let 2 0% - save-restriction 1 0% - shr--translate-insertion-chars 1 0% while 1 0% - if 1 0% progn 1 0% - if 1 0% - if 1 0% progn 1 0% - if 1 0% progn 1 0% - let* 1 0% - and 1 0% cdr 1 0% or 1 0% - cdr 1 0% assq 5 0% - shr-insert 5 0% - cond 5 0% - let 5 0% - let 3 0% - save-restriction 2 0% while 1 0% - if 1 0% progn 7 0% - shr-ensure-newline 7 0% - if 7 0% - let 4 0% - if 1 0% - or 1 0% = 3 0% get-text-property 13 0% - shr-tag-dd 12 0% - let 11 0% - shr-generic 11 0% - let 11 0% - while 11 0% - let 11 0% - if 7 0% - shr-descend 6 0% - let 2 0% - if 1 0% - cond 1 0% - funcall 1 0% shr-tag-p 1 0% - let* 1 0% - and 1 0% cdr 2 0% - cdr 1 0% assq 1 0% intern 3 0% - shr-insert 3 0% - cond 2 0% - let 1 0% - let 1 0% - save-restriction 1 0% shr--translate-insertion-chars 1 0% - shr-ensure-newline 1 0% if 15 0% - shr-insert 15 0% - cond 15 0% - let 13 0% - let 7 0% - save-restriction 6 0% - if 4 0% progn 1 0% - shr--translate-insertion-chars 1 0% while 1 0% if 1 0% - if 1 0% - and 1 0% string-match-p 1 0% - shr-ensure-paragraph 1 0% - if 1 0% - let 1 0% - cond 1 0% and 4 0% - shr-tag-p 4 0% - shr-ensure-paragraph 4 0% - if 4 0% - let 2 0% cond 2 0% get-text-property 3 0% - eww-tag-a 3 0% - let 2 0% - if 2 0% - put-text-property 2 0% if 1 0% shr-tag-a 3 0% - shr-tag-sup 3 0% - let 3 0% - shr-generic 3 0% - let 3 0% - while 2 0% - let 2 0% - if 2 0% - shr-insert 2 0% - cond 2 0% - let 2 0% let 30 0% - shr-generic 30 0% - let 30 0% - while 30 0% - let 30 0% - if 29 0% - shr-insert 29 0% - cond 28 0% - let 25 0% - let 9 0% - save-restriction 3 0% - shr--translate-insertion-chars 2 0% while 3 0% while 1 0% if 7 0% - if 5 0% - if 5 0% - progn 2 0% - shr-mark-fill 2 0% - if 1 0% progn 1 0% and 1 0% put-text-property 3 0% - if 3 0% - and 2 0% string-match-p 1 0% - shr-descend 1 0% - let 1 0% - if 1 0% - cond 1 0% shr-generic 1 0% - let 1 0% while 197 3% - shr-tag-div 197 3% - let 197 3% - if 197 3% - shr-generic 197 3% - let 197 3% - while 197 3% - let 197 3% - if 162 2% - shr-descend 160 2% - let 153 2% - if 151 2% - cond 150 2% - funcall 141 2% - shr-tag-p 125 2% - shr-generic 125 2% - let 125 2% - while 123 2% - let 121 2% - if 99 1% - shr-insert 98 1% - cond 98 1% - let 87 1% - let 67 1% - save-restriction 46 0% while 9 0% - shr--translate-insertion-chars 6 0% while 2 0% goto-char 7 0% - if 3 0% progn 7 0% - if 4 0% - if 4 0% - progn 1 0% put-text-property 1 0% = 9 0% - if 5 0% progn 3 0% - and 3 0% string-match-p 20 0% - shr-descend 17 0% - let 11 0% - if 10 0% - cond 9 0% - funcall 8 0% - eww-tag-a 4 0% - let 3 0% - if 3 0% - put-text-property 3 0% if 1 0% - shr-tag-a 1 0% let 3 0% - eww-handle-link 1 0% - let* 1 0% - assoc 1 0% if 4 0% - cdr 2 0% assq 1 0% - intern 1 0% - concat 1 0% symbol-name 15 0% - shr-ensure-paragraph 15 0% - if 14 0% - let 14 0% - cond 2 0% - save-excursion 2 0% and 2 0% - and 1 0% save-excursion 5 0% - shr-tag-div 5 0% - let 5 0% - if 2 0% - shr-generic 2 0% - let 2 0% - while 1 0% let 2 0% - shr-ensure-newline 2 0% - if 2 0% - let 1 0% - if 1 0% - or 1 0% = 2 0% - shr-tag-hr 1 0% - shr-ensure-newline 1 0% - if 1 0% let 1 0% - shr-tag-pre 1 0% - let 1 0% - shr-generic 1 0% - let 1 0% while 1 0% eww-tag-a 1 0% - let* 1 0% - if 1 0% - setq 1 0% - cons 1 0% cons 5 0% - cdr 3 0% assq 1 0% - intern 1 0% - concat 1 0% symbol-name 32 0% - shr-insert 31 0% - cond 31 0% - let 30 0% - let 16 0% - save-restriction 7 0% - if 6 0% progn 3 0% while 2 0% - shr--translate-insertion-chars 1 0% while 1 0% - if 1 0% and 20 0% - shr-tag-code 20 0% - let 20 0% - shr-generic 20 0% - let 20 0% - while 20 0% - let 20 0% - if 20 0% - shr-insert 18 0% - cond 18 0% - let 17 0% - let 7 0% - if 7 0% - if 7 0% - progn 6 0% - shr-mark-fill 6 0% - if 4 0% - progn 1 0% put-text-property 1 0% and 6 0% - save-restriction 3 0% while 1 0% if 1 0% - if 1 0% and 17 0% - shr-tag-ul 17 0% - let 17 0% - shr-generic 17 0% - let 17 0% - while 17 0% - let 17 0% - if 14 0% - shr-descend 14 0% - let 14 0% - if 14 0% - cond 14 0% - funcall 14 0% - shr-tag-li 13 0% - let 13 0% - let* 12 0% - let 10 0% - shr-generic 10 0% - let 10 0% - while 10 0% - let 9 0% - if 8 0% - shr-insert 8 0% - cond 8 0% - let 7 0% - let 4 0% - save-restriction 2 0% while 1 0% - shr--translate-insertion-chars 1 0% while 1 0% - if 1 0% progn 1 0% - shr-descend 1 0% - let 1 0% if 1 0% if 3 0% - shr-insert 3 0% - cond 3 0% - let 2 0% - let 1 0% - save-restriction 1 0% while 1 0% - if 1 0% - and 1 0% string-match-p 1 0% - eww-tag-title 1 0% - eww--after-page-change 1 0% - eww-update-header-line-format 1 0% - setq 1 0% - and 1 0% - let 1 0% - if 1 0% - progn 1 0% - let* 1 0% - cond 1 0% - > 1 0% - + 1 0% string-pixel-width 1 0% - shr-tag-h3 1 0% - shr-heading 1 0% - apply 1 0% - shr-fontize-dom 1 0% - let 1 0% - let 1 0% - while 1 0% - let 1 0% - shr-add-font 1 0% - save-excursion 1 0% - while 1 0% - if 1 0% progn 1 0% - shr-tag-h4 1 0% - shr-heading 1 0% - apply 1 0% - shr-fontize-dom 1 0% - let 1 0% - let 1 0% - while 1 0% - let 1 0% - shr-add-font 1 0% - save-excursion 1 0% - while 1 0% - add-face-text-property 1 0% min 1 0% - shr-tag-em 1 0% - shr-fontize-dom 1 0% - let 1 0% - shr-generic 1 0% - let 1 0% - while 1 0% - let 1 0% - if 1 0% - shr-insert 1 0% - cond 1 0% - let 1 0% - let 1 0% - save-restriction 1 0% while 1 0% - shr-tag-b 1 0% - shr-fontize-dom 1 0% - let 1 0% - let 1 0% - while 1 0% - let 1 0% - shr-add-font 1 0% - save-excursion 1 0% while 1 0% and 7 0% - shr-indent 7 0% - if 7 0% - progn 7 0% if 307 5% - if 306 5% - progn 158 2% - shr-vertical-motion 158 2% - if 2 0% - vertical-motion 2 0% - cons 1 0% / 147 2% - while 108 1% - shr-vertical-motion 108 1% - if 1 0% if 21 0% - let 9 0% - shr-indent 9 0% - if 9 0% - progn 9 0% - if 2 0% put-text-property 2 0% - if 2 0% - progn 1 0% - put-text-property 1 0% - shr-face-background 1 0% - and 1 0% - or 1 0% - let 1 0% let 15 0% - if 12 0% - progn 1 0% delete-char 3 0% - or 2 0% not 1 0% = 1 0% setq 1 0% or 4 0% setq 51 0% - shr--set-target-ids 51 0% - if 51 0% - let 50 0% - seq-group-by 50 0% - seq-reduce 50 0% - seq-do 50 0% - mapc 50 0% - #<compiled 0x1f6b909dc3b4177e> 50 0% #<compiled -0x59cbb93c5c11f35> 1 0% - while 1 0% - let 1 0% let 3 0% - eww-size-text-inputs 3 0% - let 3 0% - while 3 0% - if 3 0% - or 3 0% setq 68 1% - or 68 1% - list 68 1% - progn 20 0% - eww--preprocess-html 20 0% - save-excursion 20 0% - save-restriction 20 0% - let 20 0% while 19 0% - save-excursion 19 0% while 10 0% condition-case 1 0% - url-http-parse-headers 1 0% url-handle-content-transfer-encoding 9 0% + command-execute 4 0% + nsm-verify-connection
Stefan Kangas <stefankangas <at> gmail.com>
to control <at> debbugs.gnu.org
.
(Sun, 24 Dec 2023 14:36:02 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.