Rename IdxSet::clone_from.
The current situation is something of a mess. - `IdxSetBuf` derefs to `IdxSet`. - `IdxSetBuf` implements `Clone`, and therefore has a provided `clone_from` method, which does allocation and so is expensive. - `IdxSet` has a `clone_from` method that is non-allocating and therefore cheap, but this method is not from the `Clone` trait. As a result, if you have an `IdxSetBuf` called `b`, if you call `b.clone_from(b2)` you'll get the expensive `IdxSetBuf` method, but if you call `(*b).clone_from(b2)` you'll get the cheap `IdxSetBuf` method. `liveness_of_locals()` does the former, presumably unintentionally, and therefore does lots of unnecessary allocations. Having a `clone_from` method that isn't from the `Clone` trait is a bad idea in general, so this patch renames it as `overwrite`. This avoids the unnecessary allocations in `liveness_of_locals()`, speeding up most NLL benchmarks, the best by 1.5%. It also means that calls of the form `(*b).clone_from(b2)` can be rewritten as `b.overwrite(b2)`.
This commit is contained in:
parent
99a9d6806d
commit
08683f003c
4 changed files with 7 additions and 5 deletions
|
|
@ -233,7 +233,9 @@ impl<T: Idx> IdxSet<T> {
|
|||
&mut self.bits
|
||||
}
|
||||
|
||||
pub fn clone_from(&mut self, other: &IdxSet<T>) {
|
||||
/// Efficiently overwrite `self` with `other`. Panics if `self` and `other`
|
||||
/// don't have the same length.
|
||||
pub fn overwrite(&mut self, other: &IdxSet<T>) {
|
||||
self.words_mut().clone_from_slice(other.words());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue