* lisp/subr.el (delete-dups): Pre-size the hashtable.

This commit is contained in:
Stefan Monnier 2015-05-06 21:13:56 -04:00
parent bceffdb379
commit d45fd912eb

View file

@ -417,21 +417,21 @@ If N is omitted or nil, remove the last element."
Store the result in LIST and return it. LIST must be a proper list.
Of several `equal' occurrences of an element in LIST, the first
one is kept."
(if (> (length list) 100)
(let ((hash (make-hash-table :test #'equal))
(tail list)
elt retail)
(puthash (car list) t hash)
(while (setq retail (cdr tail))
(setq elt (car retail))
(if (gethash elt hash)
(setcdr tail (cdr retail))
(puthash elt t hash))
(setq tail retail)))
(let ((tail list))
(while tail
(setcdr tail (delete (car tail) (cdr tail)))
(setq tail (cdr tail)))))
(let ((l (length list)))
(if (> l 100)
(let ((hash (make-hash-table :test #'equal :size l))
(tail list) retail)
(puthash (car list) t hash)
(while (setq retail (cdr tail))
(let ((elt (car retail)))
(if (gethash elt hash)
(setcdr tail (cdr retail))
(puthash elt t hash)))
(setq tail retail)))
(let ((tail list))
(while tail
(setcdr tail (delete (car tail) (cdr tail)))
(setq tail (cdr tail))))))
list)
;; See http://lists.gnu.org/archive/html/emacs-devel/2013-05/msg00204.html