From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Ihor Radchenko Newsgroups: gmane.emacs.bugs Subject: bug#64735: 29.0.92; find invocations are ~15x slower because of ignores Date: Thu, 20 Jul 2023 17:23:22 +0000 Message-ID: <87lefapkdx.fsf@localhost> References: <1fd5e3ed-e1c3-5d6e-897f-1d5d55e379fa@gutov.dev> <87wmyupvlw.fsf@localhost> <5c4d9bea-3eb9-b262-138a-4ea0cb203436@gutov.dev> <87tttypp2e.fsf@localhost> <837cqu35lw.fsf@gnu.org> <87o7k6pmk3.fsf@localhost> <834jly351p.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="27087"; mail-complaints-to="usenet@ciao.gmane.io" Cc: dmitry@gutov.dev, 64735@debbugs.gnu.org, sbaugh@janestreet.com To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Thu Jul 20 19:24:24 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qMXO4-0006qr-0p for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 20 Jul 2023 19:24:24 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qMXNp-0008Gj-Lw; Thu, 20 Jul 2023 13:24:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qMXNj-0008Fv-Si for bug-gnu-emacs@gnu.org; Thu, 20 Jul 2023 13:24:04 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qMXNi-0005bC-RY for bug-gnu-emacs@gnu.org; Thu, 20 Jul 2023 13:24:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qMXNi-0000Dw-Ft for bug-gnu-emacs@gnu.org; Thu, 20 Jul 2023 13:24:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Ihor Radchenko Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 20 Jul 2023 17:24:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64735 X-GNU-PR-Package: emacs Original-Received: via spool by 64735-submit@debbugs.gnu.org id=B64735.1689873817827 (code B ref 64735); Thu, 20 Jul 2023 17:24:02 +0000 Original-Received: (at 64735) by debbugs.gnu.org; 20 Jul 2023 17:23:37 +0000 Original-Received: from localhost ([127.0.0.1]:59795 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qMXNJ-0000DH-6V for submit@debbugs.gnu.org; Thu, 20 Jul 2023 13:23:37 -0400 Original-Received: from mout01.posteo.de ([185.67.36.65]:33023) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qMXND-0000D0-LQ for 64735@debbugs.gnu.org; Thu, 20 Jul 2023 13:23:35 -0400 Original-Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id C8DBA240028 for <64735@debbugs.gnu.org>; Thu, 20 Jul 2023 19:23:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1689873805; bh=4wHMnJ3CJE3RL+TFR2BXOtnSoIN8OM7SMTBeej3VEb4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:From; b=XF8cL+KuwyqHDNkhK32ovQY5Pd5FDsLDKahNh6Natg6Djpi9lY899cCKqyFkPKLsr KCAeRIb8gIJNOQYcaF8GwHEjb8Gx7RyA55ztgbGDs0qHptz9cMeUuaC9cfcU7ppjRy FQVZJLOJnT8Mxi9bBAiCqcPjU4r+lFchMuTxxX2sozXJBbpzaktQZDclUDLeNi0TlV eV2f5fZ6RZxCNLYB+Mgzz/LxbM5kUoKM3RpBqQymmPLogkkPXntQjqbdFcUARfNPrS 1ElfiljnXHib7zo7JrjiJj5hCcm1kvagge/tWR2rw3+RYNFFcZXMH0rJC3kWLYOCat Yoq6ZEzSE7msg== Original-Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4R6KJz04Nrz6txN; Thu, 20 Jul 2023 19:23:14 +0200 (CEST) In-Reply-To: <834jly351p.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:265623 Archived-At: Eli Zaretskii writes: >> I am not sure if this specific issue is important. >> If we want to use find from Emacs, we would need to create Emacs >> string/strings when reading the output of find anyway. > > So how do you explain that using Find is faster than using > find-lisp.el? > > I think the answer is that using Find as a subprocess conses less. No. It uses less excessive regexp matching Emacs is trying to do in file-name-handler-alist. (ignore (let ((gc-cons-threshold most-positive-fixnum)) (benchmark-progn (find-lisp-find-files "/home/yantar92/.data" "")))) ;; Elapsed time: 2.982393s (ignore (let ((gc-cons-threshold most-positive-fixnum) file-name-handler-alist) (benchmark-progn (find-lisp-find-files "/home/yantar92/.data" "")))) ;; Elapsed time: 0.784461s 22.83% emacs emacs [.] Fnconc 10.01% emacs emacs [.] Fexpand_file_name 9.22% emacs emacs [.] eval_sub 3.47% emacs emacs [.] assq_no_quit 2.68% emacs emacs [.] getenv_internal_1 2.50% emacs emacs [.] mem_insert.isra.0 2.24% emacs emacs [.] Fassq 2.02% emacs emacs [.] set_buffer_internal_2 (ignore (let ((gc-cons-threshold most-positive-fixnum) file-name-handler-alist) (benchmark-progn (find-lisp-find-files "/home/yantar92/.data" "")))) ;; Elapsed time: 0.624987s 12.39% emacs emacs [.] eval_sub 12.07% emacs emacs [.] Fexpand_file_name 4.97% emacs emacs [.] assq_no_quit 4.11% emacs emacs [.] getenv_internal_1 2.77% emacs emacs [.] set_buffer_internal_2 2.61% emacs emacs [.] mem_insert.isra.0 2.47% emacs emacs [.] make_clear_multibyte_string.part.0 Non-recursive version of `find-lisp-find-files-internal' is below, though it provides limited improvement. (defun find-lisp-find-files-internal (directory file-predicate directory-predicate) "Find files under DIRECTORY which satisfy FILE-PREDICATE. FILE-PREDICATE is a function which takes two arguments: the file and its directory. DIRECTORY-PREDICATE is used to decide whether to descend into directories. It is a function which takes two arguments, the directory and its parent." (setq directory (file-name-as-directory directory)) (let (results fullname (dirs (list (expand-file-name directory)))) (while dirs (setq directory (pop dirs)) (dolist (file (directory-files directory nil nil t)) (setq fullname (concat directory file)) (when (file-readable-p fullname) ;; If a directory, check it we should descend into it (and (file-directory-p fullname) (setq fullname (concat fullname "/")) (funcall directory-predicate file directory) (push fullname dirs)) ;; For all files and directories, call the file predicate (and (funcall file-predicate file directory) (push fullname results))))) results)) -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at . Support Org development at , or support my work at