Skip to content

Commit e2e724c

Browse files
committed
Optimize FlatMultiMapBuilder
1 parent fca4bc5 commit e2e724c

File tree

2 files changed

+16
-17
lines changed

2 files changed

+16
-17
lines changed

src/filters/fb_network_builder.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ impl<'a> FlatSerialize<'a, EngineFlatBuilder<'a>> for NetworkFilterListBuilder {
129129
rule_list: Self,
130130
builder: &mut EngineFlatBuilder<'a>,
131131
) -> WIPOffset<fb::NetworkFilterList<'a>> {
132-
let mut filter_map = HashMap::<ShortHash, Vec<WIPOffset<fb::NetworkFilter<'a>>>>::new();
132+
let mut filter_map_builder = FlatMultiMapBuilder::with_capacity(rule_list.filters.len());
133133

134134
let mut optimizable = HashMap::<ShortHash, Vec<NetworkFilter>>::new();
135135

@@ -158,7 +158,7 @@ impl<'a> FlatSerialize<'a, EngineFlatBuilder<'a>> for NetworkFilterListBuilder {
158158

159159
let mut store_filter = |token: ShortHash| {
160160
if let Some(flat_filter) = flat_filter {
161-
filter_map.entry(token).or_default().push(flat_filter);
161+
filter_map_builder.insert(token, flat_filter);
162162
} else {
163163
optimizable
164164
.entry(token)
@@ -212,7 +212,7 @@ impl<'a> FlatSerialize<'a, EngineFlatBuilder<'a>> for NetworkFilterListBuilder {
212212

213213
for filter in optimized {
214214
let flat_filter = FlatSerialize::serialize(&filter, builder);
215-
filter_map.entry(token).or_default().push(flat_filter);
215+
filter_map_builder.insert(token, flat_filter);
216216
}
217217
}
218218
} else {
@@ -222,8 +222,7 @@ impl<'a> FlatSerialize<'a, EngineFlatBuilder<'a>> for NetworkFilterListBuilder {
222222
);
223223
}
224224

225-
let flat_filter_map_builder = FlatMultiMapBuilder::from_filter_map(filter_map);
226-
let flat_filter_map = FlatMultiMapBuilder::finish(flat_filter_map_builder, builder);
225+
let flat_filter_map = FlatMultiMapBuilder::finish(filter_map_builder, builder);
227226

228227
fb::NetworkFilterList::create(
229228
builder.raw_builder(),

src/flatbuffers/containers/flat_multimap.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{collections::HashMap, marker::PhantomData};
1+
use std::marker::PhantomData;
22

33
use crate::flatbuffers::containers;
44
use containers::flat_serialize::{FlatBuilder, FlatMapBuilderOutput, FlatSerialize};
@@ -85,17 +85,19 @@ where
8585

8686
#[derive(Default)]
8787
pub(crate) struct FlatMultiMapBuilder<I, V> {
88-
map: HashMap<I, Vec<V>>,
88+
entries: Vec<(I, V)>,
8989
}
9090

9191
impl<I: Ord + std::hash::Hash, V> FlatMultiMapBuilder<I, V> {
92-
pub fn from_filter_map(map: HashMap<I, Vec<V>>) -> Self {
93-
Self { map }
92+
pub fn with_capacity(capacity: usize) -> Self {
93+
Self {
94+
entries: Vec::with_capacity(capacity),
95+
}
9496
}
9597

9698
#[allow(dead_code)] // Unused code is allowed during cosmetic filter migration
9799
pub fn insert(&mut self, key: I, value: V) {
98-
self.map.entry(key).or_default().push(value);
100+
self.entries.push((key, value));
99101
}
100102

101103
pub fn finish<'a, B: FlatBuilder<'a>>(
@@ -106,17 +108,15 @@ impl<I: Ord + std::hash::Hash, V> FlatMultiMapBuilder<I, V> {
106108
I: FlatSerialize<'a, B>,
107109
V: FlatSerialize<'a, B>,
108110
{
109-
let mut entries: Vec<_> = value.map.into_iter().collect();
110-
entries.sort_unstable_by(|(a, _), (b, _)| a.cmp(b));
111+
let mut entries = value.entries;
112+
entries.sort_by(|(a, _), (b, _)| a.cmp(b));
111113
let mut indexes = Vec::with_capacity(entries.len());
112114
let mut values = Vec::with_capacity(entries.len());
113115

114-
for (key, mv) in entries.into_iter() {
116+
for (key, value) in entries {
115117
let index = FlatSerialize::serialize(key, builder);
116-
for value in mv.into_iter() {
117-
indexes.push(index.clone());
118-
values.push(FlatSerialize::serialize(value, builder));
119-
}
118+
indexes.push(index);
119+
values.push(FlatSerialize::serialize(value, builder));
120120
}
121121

122122
let indexes_vec = builder.raw_builder().create_vector(&indexes);

0 commit comments

Comments
 (0)