[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
empty-directory predicate, native implementation
From: |
Arthur Miller |
Subject: |
empty-directory predicate, native implementation |
Date: |
Tue, 13 Oct 2020 04:22:36 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
It is easy to check for an empty dir in elisp; we can just list files
and check if there is a list or not:
(null (directory-files directory-name nil nodots t)))
where nodots is just regex to omit dot files (from dired+).
But then this is quite inneficient. We are listing all files in each
dir since directory-files will return entire content of directory. Also
we are matching every filename to a regex just to eliminate first two.
Alternative would be to take length and see if it is > 2; but then we
would iterate whole list twice. So I can't see anything avialable in
dired/elisp and I think a predicate implemented in low-level is better solution.
We are really interested just to see if there is some file; so we can
just open dir, and read first few entries, if there is more then 2 files
(. and .. on *nix) we can just abort and return true.
I have tested an idea with getdents (Linux syscall) and I can see
difference. Attached is a patch for dired.c and a test file to play with
some benchmark.
In somewhat synthetic test where I just looped a "lisp" and "native"
predicate over a several hundred directories, I can see quite drammatic
difference in performance. On a directory with something about ~800
subdirs, native prediate takes ~0.002s while lisp predicate goes in ~0.01s.
I have made also a small test to mark empty dirs in dired, and there I
see some difference. On same directory, I get consistently
~2.4s for lisp version and ~2s for native version.
This isn't any kind of drammatic difference for most use; file I/O
is dominated by disk access anyway, but i still don't like to spend cpu
on unnecessary evaluations, so I wonder if we could get native predicate
in elisp?
dired-mark-empty.el
Description: dired-mark-empty.el
dired.patch
Description: dired.patch
- empty-directory predicate, native implementation,
Arthur Miller <=
- Re: empty-directory predicate, native implementation, Michael Albinus, 2020/10/13
- Re: empty-directory predicate, native implementation, Arthur Miller, 2020/10/13
- Re: empty-directory predicate, native implementation, Michael Albinus, 2020/10/13
- Re: empty-directory predicate, native implementation, Arthur Miller, 2020/10/13
- Re: empty-directory predicate, native implementation, Michael Albinus, 2020/10/13
- Re: empty-directory predicate, native implementation, Arthur Miller, 2020/10/13
- Re: empty-directory predicate, native implementation, Michael Albinus, 2020/10/14
- Re: empty-directory predicate, native implementation, Arthur Miller, 2020/10/14
Re: empty-directory predicate, native implementation, Eli Zaretskii, 2020/10/13