]> git.lizzy.rs Git - rust.git/commitdiff
Auto merge of #31718 - apasel422:issue-31711, r=bluss
authorbors <bors@rust-lang.org>
Wed, 17 Feb 2016 16:18:54 +0000 (16:18 +0000)
committerbors <bors@rust-lang.org>
Wed, 17 Feb 2016 16:18:54 +0000 (16:18 +0000)
This changes the performance of `drop` from linear to constant time for such `HashMap`s.

Closes #31711.

r? @bluss

src/libstd/collections/hash/table.rs

index 316c75952667c9e621e91da24e2bc40657c78bab..97cab94b67bd132fa5c8973e023d38de4549b55a 100644 (file)
@@ -12,6 +12,7 @@
 
 use cmp;
 use hash::{Hash, Hasher, BuildHasher};
+use intrinsics::needs_drop;
 use marker;
 use mem::{align_of, size_of};
 use mem;
@@ -1009,7 +1010,9 @@ fn drop(&mut self) {
         // dropping empty tables such as on resize.
         // Also avoid double drop of elements that have been already moved out.
         unsafe {
-            for _ in self.rev_move_buckets() {}
+            if needs_drop::<(K, V)>() { // avoid linear runtime for types that don't need drop
+                for _ in self.rev_move_buckets() {}
+            }
         }
 
         let hashes_size = self.capacity * size_of::<u64>();