Skip to content

Commit 8db16bc

Browse files
committed
Benchmarks and experiments using rapidhash instead of FNV
Signed-off-by: Liam Gray <[email protected]>
1 parent 2289dce commit 8db16bc

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ protobuf = { version = "^3.7.2", optional = true }
3232
memchr = "^2.3"
3333
reqwest = { version = "^0.12", features = ["blocking"], optional = true }
3434
thiserror = "^2.0"
35+
rapidhash = { version = "1.4.0" } # path = "../rapidhash"
3536

3637
[target.'cfg(target_os = "linux")'.dependencies]
3738
procfs = { version = "^0.17", optional = true, default-features = false }

benches/counter.rs

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use prometheus::{Counter, CounterVec, IntCounter, Opts};
1717
use std::collections::HashMap;
1818
use std::sync::{atomic, Arc};
1919
use std::thread;
20+
use rapidhash::RapidBuildHasher;
2021

2122
fn bench_counter_with_label_values(c: &mut Criterion) {
2223
let counter = CounterVec::new(
@@ -69,6 +70,132 @@ fn bench_counter_with_mapped_labels_fnv(c: &mut Criterion) {
6970
});
7071
}
7172

73+
fn bench_counter_with_mapped_labels_rapidhash(c: &mut Criterion) {
74+
let counter = CounterVec::new(
75+
Opts::new("benchmark_counter", "A counter to benchmark it."),
76+
&["one", "two", "three"],
77+
)
78+
.unwrap();
79+
80+
c.bench_function("counter_with_mapped_labels_rapidhash", |b| {
81+
b.iter(|| {
82+
let mut labels = HashMap::with_capacity_and_hasher(3, RapidBuildHasher::default());
83+
labels.insert("two", "zwei");
84+
labels.insert("one", "eins");
85+
labels.insert("three", "drei");
86+
counter.with(&black_box(labels)).inc();
87+
})
88+
});
89+
}
90+
91+
fn bench_counter_with_mapped_mid_labels(c: &mut Criterion) {
92+
let counter = CounterVec::new(
93+
Opts::new("benchmark_counter", "A counter to benchmark it."),
94+
&["midsize_one", "midsize_two", "midsize_three"],
95+
)
96+
.unwrap();
97+
98+
c.bench_function("counter_with_mapped_mid_labels", |b| {
99+
b.iter(|| {
100+
let mut labels = HashMap::with_capacity(3);
101+
labels.insert("midsize_two", "midsize_zwei");
102+
labels.insert("midsize_one", "midsize_eins");
103+
labels.insert("midsize_three", "midsize_drei");
104+
counter.with(&black_box(labels)).inc();
105+
})
106+
});
107+
}
108+
109+
fn bench_counter_with_mapped_mid_labels_fnv(c: &mut Criterion) {
110+
let counter = CounterVec::new(
111+
Opts::new("benchmark_counter", "A counter to benchmark it."),
112+
&["midsize_one", "midsize_two", "midsize_three"],
113+
)
114+
.unwrap();
115+
116+
c.bench_function("counter_with_mapped_mid_labels_fnv", |b| {
117+
b.iter(|| {
118+
let mut labels = HashMap::with_capacity_and_hasher(3, FnvBuildHasher::default());
119+
labels.insert("midsize_two", "midsize_zwei");
120+
labels.insert("midsize_one", "midsize_eins");
121+
labels.insert("midsize_three", "midsize_drei");
122+
counter.with(&black_box(labels)).inc();
123+
})
124+
});
125+
}
126+
127+
fn bench_counter_with_mapped_mid_labels_rapidhash(c: &mut Criterion) {
128+
let counter = CounterVec::new(
129+
Opts::new("benchmark_counter", "A counter to benchmark it."),
130+
&["midsize_one", "midsize_two", "midsize_three"],
131+
)
132+
.unwrap();
133+
134+
c.bench_function("counter_with_mapped_mid_labels_rapidhash", |b| {
135+
b.iter(|| {
136+
let mut labels = HashMap::with_capacity_and_hasher(3, RapidBuildHasher::default());
137+
labels.insert("midsize_two", "midsize_zwei");
138+
labels.insert("midsize_one", "midsize_eins");
139+
labels.insert("midsize_three", "midsize_drei");
140+
counter.with(&black_box(labels)).inc();
141+
})
142+
});
143+
}
144+
145+
fn bench_counter_with_mapped_long_labels(c: &mut Criterion) {
146+
let counter = CounterVec::new(
147+
Opts::new("benchmark_counter", "A counter to benchmark it."),
148+
&["longer_field_number_one", "longer_field_number_two", "longer_field_number_three"],
149+
)
150+
.unwrap();
151+
152+
c.bench_function("counter_with_mapped_longer_labels", |b| {
153+
b.iter(|| {
154+
let mut labels = HashMap::with_capacity(3);
155+
labels.insert("longer_field_number_two", "longer_field_number_zwei");
156+
labels.insert("longer_field_number_one", "longer_field_number_eins");
157+
labels.insert("longer_field_number_three", "longer_field_number_drei");
158+
counter.with(&black_box(labels)).inc();
159+
})
160+
});
161+
}
162+
163+
fn bench_counter_with_mapped_long_labels_fnv(c: &mut Criterion) {
164+
let counter = CounterVec::new(
165+
Opts::new("benchmark_counter", "A counter to benchmark it."),
166+
&["longer_field_number_one", "longer_field_number_two", "longer_field_number_three"],
167+
)
168+
.unwrap();
169+
170+
c.bench_function("counter_with_mapped_longer_labels_fnv", |b| {
171+
b.iter(|| {
172+
let mut labels = HashMap::with_capacity_and_hasher(3, FnvBuildHasher::default());
173+
labels.insert("longer_field_number_two", "longer_field_number_zwei");
174+
labels.insert("longer_field_number_one", "longer_field_number_eins");
175+
labels.insert("longer_field_number_three", "longer_field_number_drei");
176+
counter.with(&black_box(labels)).inc();
177+
})
178+
});
179+
}
180+
181+
fn bench_counter_with_mapped_long_labels_rapidhash(c: &mut Criterion) {
182+
let counter = CounterVec::new(
183+
Opts::new("benchmark_counter", "A counter to benchmark it."),
184+
&["longer_field_number_one", "longer_field_number_two", "longer_field_number_three"],
185+
)
186+
.unwrap();
187+
188+
c.bench_function("counter_with_mapped_longer_labels_rapidhash", |b| {
189+
b.iter(|| {
190+
let mut labels = HashMap::with_capacity_and_hasher(3, RapidBuildHasher::default());
191+
labels.insert("longer_field_number_two", "longer_field_number_zwei");
192+
labels.insert("longer_field_number_one", "longer_field_number_eins");
193+
labels.insert("longer_field_number_three", "longer_field_number_drei");
194+
counter.with(&black_box(labels)).inc();
195+
})
196+
});
197+
}
198+
72199
fn bench_counter_with_prepared_mapped_labels(c: &mut Criterion) {
73200
let counter = CounterVec::new(
74201
Opts::new("benchmark_counter", "A counter to benchmark it."),
@@ -216,6 +343,13 @@ criterion_group!(
216343
bench_counter_with_label_values_concurrent_write,
217344
bench_counter_with_mapped_labels,
218345
bench_counter_with_mapped_labels_fnv,
346+
bench_counter_with_mapped_labels_rapidhash,
347+
bench_counter_with_mapped_mid_labels,
348+
bench_counter_with_mapped_mid_labels_fnv,
349+
bench_counter_with_mapped_mid_labels_rapidhash,
350+
bench_counter_with_mapped_long_labels,
351+
bench_counter_with_mapped_long_labels_fnv,
352+
bench_counter_with_mapped_long_labels_rapidhash,
219353
bench_counter_with_prepared_mapped_labels,
220354
bench_int_counter_no_labels,
221355
bench_int_counter_no_labels_concurrent_write,

src/vec.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use std::collections::HashMap;
55
use std::hash::{BuildHasher, Hasher};
66
use std::sync::Arc;
77

8-
use fnv::FnvHasher;
8+
// TODO: experimenting, alternating while benchmarking
9+
// use fnv::FnvHasher;
10+
use rapidhash::RapidHasher as FnvHasher;
911
use parking_lot::RwLock;
1012

1113
use crate::desc::{Desc, Describer};

0 commit comments

Comments
 (0)