From: Stefan Monnier Date: Thu, 7 May 2015 01:13:56 +0000 (-0400) Subject: * lisp/subr.el (delete-dups): Pre-size the hashtable. X-Git-Tag: emacs-25.0.90~2169 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d45fd912eb7b90ce552db722dbe5893915f0fa1b;p=emacs.git * lisp/subr.el (delete-dups): Pre-size the hashtable. --- diff --git a/lisp/subr.el b/lisp/subr.el index ce9b44c6ef9..9c56e51bc96 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -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