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:
志宇 2024-01-07 14:39:31 +08:00
parent cd602430ee
commit eb1714aee0
No known key found for this signature in database
GPG Key ID: F6345C9837C2BDE8
3 changed files with 17 additions and 10 deletions

View File

@ -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.

View File

@ -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 {

View File

@ -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(