-
Notifications
You must be signed in to change notification settings - Fork 385
/
ddsketch.rs
70 lines (65 loc) · 2.03 KB
/
ddsketch.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use criterion::{criterion_group, criterion_main, Criterion};
use opentelemetry::metrics::{InstrumentKind, Number, NumberKind};
use opentelemetry::sdk::export::metrics::Aggregator;
use opentelemetry::{
metrics::Descriptor,
sdk::metrics::aggregators::{ArrayAggregator, DdSketchAggregator, DdSketchConfig},
};
use rand::Rng;
use std::sync::Arc;
fn generate_normal_data(num: usize) -> Vec<f64> {
let mut data = Vec::with_capacity(num);
for _ in 0..num {
data.push(rand::thread_rng().gen_range(-100..10000) as f64);
}
data
}
fn ddsketch(data: Vec<f64>) {
let aggregator =
DdSketchAggregator::new(&DdSketchConfig::new(0.001, 2048, 1e-9), NumberKind::F64);
let descriptor = Descriptor::new(
"test".to_string(),
"test",
None,
InstrumentKind::Histogram,
NumberKind::F64,
);
for f in data {
aggregator.update(&Number::from(f), &descriptor).unwrap();
}
let new_aggregator: Arc<(dyn Aggregator + Send + Sync)> = Arc::new(DdSketchAggregator::new(
&DdSketchConfig::new(0.001, 2048, 1e-9),
NumberKind::F64,
));
aggregator
.synchronized_move(&new_aggregator, &descriptor)
.unwrap();
}
fn array(data: Vec<f64>) {
let aggregator = ArrayAggregator::default();
let descriptor = Descriptor::new(
"test".to_string(),
"test",
None,
InstrumentKind::Histogram,
NumberKind::F64,
);
for f in data {
aggregator.update(&Number::from(f), &descriptor).unwrap();
}
let new_aggregator: Arc<(dyn Aggregator + Send + Sync)> = Arc::new(ArrayAggregator::default());
aggregator
.synchronized_move(&new_aggregator, &descriptor)
.unwrap();
}
pub fn histogram(c: &mut Criterion) {
let data = generate_normal_data(5000);
c.bench_function("ddsketch", |b| {
b.iter(|| {
ddsketch(data.clone());
})
});
c.bench_function("array", |b| b.iter(|| array(data.clone())));
}
criterion_group!(benches, histogram);
criterion_main!(benches);