Avoid iteration when dropping HashMap
s whose items don't need dropping
This changes the performance of `drop` from linear to constant time for such `HashMap`s. Closes #31711.
This commit is contained in:
parent
9658645407
commit
f890772383
@ -12,6 +12,7 @@ use alloc::heap::{allocate, deallocate, EMPTY};
|
|||||||
|
|
||||||
use cmp;
|
use cmp;
|
||||||
use hash::{Hash, Hasher, BuildHasher};
|
use hash::{Hash, Hasher, BuildHasher};
|
||||||
|
use intrinsics::needs_drop;
|
||||||
use marker;
|
use marker;
|
||||||
use mem::{align_of, size_of};
|
use mem::{align_of, size_of};
|
||||||
use mem;
|
use mem;
|
||||||
@ -1009,7 +1010,9 @@ impl<K, V> Drop for RawTable<K, V> {
|
|||||||
// dropping empty tables such as on resize.
|
// dropping empty tables such as on resize.
|
||||||
// Also avoid double drop of elements that have been already moved out.
|
// Also avoid double drop of elements that have been already moved out.
|
||||||
unsafe {
|
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>();
|
let hashes_size = self.capacity * size_of::<u64>();
|
||||||
|
Loading…
Reference in New Issue
Block a user