summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2020-10-31 11:41:53 +0200
committerEli Zaretskii <eliz@gnu.org>2020-10-31 11:41:53 +0200
commit96ec0340716292f577f6dcaa0f8102f1a04e1d5e (patch)
tree30e7f40fc143741f2ab0d02d3a24806a6718113f
parent41c4f337c8f798d4700dcd13b73ad4ccdb3257eb (diff)
downloademacs-96ec0340716292f577f6dcaa0f8102f1a04e1d5e.tar.gz
Speed up ls-lisp
This speeds up Dired by 25% in large directories. * lisp/ls-lisp.el (ls-lisp--time-locale): New defvar. (ls-lisp-format-time): calculate the locale for formatting times only once and cache the value in 'ls-lisp--time-locale'. (Bug#44273)
-rw-r--r--lisp/ls-lisp.el9
1 files changed, 7 insertions, 2 deletions
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el
index 8851522bbdb..e2646209313 100644
--- a/lisp/ls-lisp.el
+++ b/lisp/ls-lisp.el
@@ -836,6 +836,9 @@ Return nil if no time switch found."
((memq ?t switches) 5) ; last modtime
((memq ?u switches) 4))) ; last access
+(defvar ls-lisp--time-locale nil
+ "Locale to be used for formatting file times.")
+
(defun ls-lisp-format-time (file-attr time-index)
"Format time for file with attributes FILE-ATTR according to TIME-INDEX.
Use the same method as ls to decide whether to show time-of-day or year,
@@ -851,11 +854,13 @@ All ls time options, namely c, t and u, are handled."
(condition-case nil
;; Use traditional time format in the C or POSIX locale,
;; ISO-style time format otherwise, so columns line up.
- (let ((locale system-time-locale))
+ (let ((locale (or system-time-locale ls-lisp--time-locale)))
(if (not locale)
(let ((vars '("LC_ALL" "LC_TIME" "LANG")))
(while (and vars (not (setq locale (getenv (car vars)))))
- (setq vars (cdr vars)))))
+ (setq vars (cdr vars)))
+ ;; Cache the locale for next calls.
+ (setq ls-lisp--time-locale (or locale "C"))))
(if (member locale '("C" "POSIX"))
(setq locale nil))
(format-time-string