|
From: | Michael Heerdegen |
Subject: | bug#37321: 27.0.50; Excessive gc in a use case (el-search) |
Date: | Sat, 07 Sep 2019 17:30:57 +0200 |
User-agent: | Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) |
Michael Heerdegen <michael_heerdegen@web.de> writes: > #+begin_src emacs-lisp > (defun el-search--flatten-tree (tree) > "Return a list of `el-search--atomic-p' objects in TREE." > (let ((elements ()) > (walked-objects ;to avoid infinite recursion for circular TREEs > (make-hash-table :test #'eq)) > (gc-cons-percentage 0.8) > ) ;Why is binding it here more effective than binding it more > top-level? > (cl-labels ((walker (object) > (if (el-search--atomic-p object) > (push object elements) > (unless (gethash object walked-objects) > (puthash object t walked-objects) > (if (consp object) > (progn > (while (consp object) > (walker (car object)) > (setq object (cdr object)) > (if (gethash object walked-objects) > (setq object nil) > (puthash object t walked-objects))) > (when object ;dotted list > (walker object))) > (cl-loop for elt being the elements of object > do (walker elt))))))) > (walker tree) > elements))) > #+end_src It doesn't seem to be related to the hash table usage - if I remove the hash table test based infloop check part of the function, the behavior wrt gc doesn't change. So I wonder what in this function does it make so much depend on gc behavior? Michael.
[Prev in Thread] | Current Thread | [Next in Thread] |