fix(chain): avoid using BTreeMap::append
The implementation of `BTreeMap::append` is non-performant making merging changesets very slow. We use `Extend::extend` instead. Refer to: https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
This commit is contained in:
parent
cd602430ee
commit
eb1714aee0
@ -58,8 +58,9 @@ impl<K: Ord> Append for ChangeSet<K> {
|
|||||||
*index = other_index.max(*index);
|
*index = other_index.max(*index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// We use `extend` instead of `BTreeMap::append` due to performance issues with `append`.
|
||||||
self.0.append(&mut other.0);
|
// Refer to https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
|
||||||
|
self.0.extend(other.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns whether the changeset are empty.
|
/// Returns whether the changeset are empty.
|
||||||
|
@ -123,8 +123,10 @@ pub trait Append {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<K: Ord, V> Append for BTreeMap<K, V> {
|
impl<K: Ord, V> Append for BTreeMap<K, V> {
|
||||||
fn append(&mut self, mut other: Self) {
|
fn append(&mut self, other: Self) {
|
||||||
BTreeMap::append(self, &mut other)
|
// We use `extend` instead of `BTreeMap::append` due to performance issues with `append`.
|
||||||
|
// Refer to https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
|
||||||
|
BTreeMap::extend(self, other)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_empty(&self) -> bool {
|
fn is_empty(&self) -> bool {
|
||||||
@ -133,8 +135,10 @@ impl<K: Ord, V> Append for BTreeMap<K, V> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Ord> Append for BTreeSet<T> {
|
impl<T: Ord> Append for BTreeSet<T> {
|
||||||
fn append(&mut self, mut other: Self) {
|
fn append(&mut self, other: Self) {
|
||||||
BTreeSet::append(self, &mut other)
|
// We use `extend` instead of `BTreeMap::append` due to performance issues with `append`.
|
||||||
|
// Refer to https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
|
||||||
|
BTreeSet::extend(self, other)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_empty(&self) -> bool {
|
fn is_empty(&self) -> bool {
|
||||||
|
@ -1271,10 +1271,12 @@ impl<A> ChangeSet<A> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<A: Ord> Append for ChangeSet<A> {
|
impl<A: Ord> Append for ChangeSet<A> {
|
||||||
fn append(&mut self, mut other: Self) {
|
fn append(&mut self, other: Self) {
|
||||||
self.txs.append(&mut other.txs);
|
// We use `extend` instead of `BTreeMap::append` due to performance issues with `append`.
|
||||||
self.txouts.append(&mut other.txouts);
|
// Refer to https://github.com/rust-lang/rust/issues/34666#issuecomment-675658420
|
||||||
self.anchors.append(&mut other.anchors);
|
self.txs.extend(other.txs);
|
||||||
|
self.txouts.extend(other.txouts);
|
||||||
|
self.anchors.extend(other.anchors);
|
||||||
|
|
||||||
// last_seen timestamps should only increase
|
// last_seen timestamps should only increase
|
||||||
self.last_seen.extend(
|
self.last_seen.extend(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user