]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/subr.el (delete-dups): Pre-size the hashtable.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 7 May 2015 01:13:56 +0000 (21:13 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 7 May 2015 01:13:56 +0000 (21:13 -0400)
lisp/subr.el

index ce9b44c6ef9dc31a9697d3860154bd0b55660164..9c56e51bc967796924a45da114d8947ce13fb9d6 100644 (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