Skip to content

Commit 075d26c

Browse files
authored
Improve cost of creating AttributeSets (#1379)
1 parent 073f7a6 commit 075d26c

File tree

1 file changed

+24
-23
lines changed
  • opentelemetry-sdk/src/attributes

1 file changed

+24
-23
lines changed

opentelemetry-sdk/src/attributes/set.rs

+24-23
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use std::collections::HashSet;
12
use std::{
23
cmp::Ordering,
3-
collections::{BTreeSet, HashSet},
44
hash::{Hash, Hasher},
55
};
66

@@ -105,36 +105,37 @@ impl Eq for HashKeyValue {}
105105
/// This must implement [Hash], [PartialEq], and [Eq] so it may be used as
106106
/// HashMap keys and other de-duplication methods.
107107
#[derive(Clone, Default, Debug, Hash, PartialEq, Eq)]
108-
pub struct AttributeSet(BTreeSet<HashKeyValue>);
108+
pub struct AttributeSet(Vec<HashKeyValue>);
109109

110110
impl From<&[KeyValue]> for AttributeSet {
111111
fn from(values: &[KeyValue]) -> Self {
112-
let mut seen = HashSet::with_capacity(values.len());
113-
AttributeSet(
114-
values
115-
.iter()
116-
.rev()
117-
.filter_map(|kv| {
118-
if seen.contains(&&kv.key) {
119-
None
120-
} else {
121-
seen.insert(&kv.key);
122-
Some(HashKeyValue(kv.clone()))
123-
}
124-
})
125-
.collect(),
126-
)
112+
let mut seen_keys = HashSet::with_capacity(values.len());
113+
let mut vec = values
114+
.iter()
115+
.rev()
116+
.filter_map(|kv| {
117+
if seen_keys.insert(kv.key.clone()) {
118+
Some(HashKeyValue(kv.clone()))
119+
} else {
120+
None
121+
}
122+
})
123+
.collect::<Vec<_>>();
124+
vec.sort_unstable();
125+
126+
AttributeSet(vec)
127127
}
128128
}
129129

130130
impl From<&Resource> for AttributeSet {
131131
fn from(values: &Resource) -> Self {
132-
AttributeSet(
133-
values
134-
.iter()
135-
.map(|(key, value)| HashKeyValue(KeyValue::new(key.clone(), value.clone())))
136-
.collect(),
137-
)
132+
let mut vec = values
133+
.iter()
134+
.map(|(key, value)| HashKeyValue(KeyValue::new(key.clone(), value.clone())))
135+
.collect::<Vec<_>>();
136+
vec.sort_unstable();
137+
138+
AttributeSet(vec)
138139
}
139140
}
140141

0 commit comments

Comments
 (0)