blob: 8416e842e2309ff392d4157706eb821c8d8c936c [file] [log] [blame] [edit]
// Copyright 2016 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
use criterion::{criterion_group, criterion_main, Criterion};
use prometheus::{core::Collector, Histogram, HistogramOpts, HistogramVec};
use std::sync::{atomic, Arc};
use std::thread;
fn bench_histogram_with_label_values(c: &mut Criterion) {
let histogram = HistogramVec::new(
HistogramOpts::new("benchmark_histogram", "A histogram to benchmark it."),
&["one", "two", "three"],
)
.unwrap();
c.bench_function("bench_histogram_with_label_values", |b| {
b.iter(|| {
histogram
.with_label_values(&["eins", "zwei", "drei"])
.observe(3.1415)
})
});
}
fn bench_histogram_no_labels(c: &mut Criterion) {
let histogram = Histogram::with_opts(HistogramOpts::new(
"benchmark_histogram",
"A histogram to benchmark it.",
))
.unwrap();
c.bench_function("bench_histogram_no_labels", |b| {
b.iter(|| histogram.observe(3.1415))
});
}
fn bench_histogram_timer(c: &mut Criterion) {
let histogram = Histogram::with_opts(HistogramOpts::new(
"benchmark_histogram_timer",
"A histogram to benchmark it.",
))
.unwrap();
c.bench_function("bench_histogram_timer", |b| {
b.iter(|| histogram.start_timer())
});
}
fn bench_histogram_local(c: &mut Criterion) {
let histogram = Histogram::with_opts(HistogramOpts::new(
"benchmark_histogram_local",
"A histogram to benchmark it.",
))
.unwrap();
let local = histogram.local();
c.bench_function("bench_histogram_local", |b| {
b.iter(|| local.observe(3.1415));
});
local.flush();
}
fn bench_local_histogram_timer(c: &mut Criterion) {
let histogram = Histogram::with_opts(HistogramOpts::new(
"benchmark_histogram_local_timer",
"A histogram to benchmark it.",
))
.unwrap();
let local = histogram.local();
c.bench_function("bench_local_histogram_timer", |b| {
b.iter(|| local.start_timer());
});
local.flush();
}
fn concurrent_observe_and_collect(c: &mut Criterion) {
let signal_exit = Arc::new(atomic::AtomicBool::new(false));
let opts = HistogramOpts::new("test_name", "test help").buckets(vec![1.0]);
let histogram = Histogram::with_opts(opts).unwrap();
let mut handlers = vec![];
for _ in 0..4 {
let histogram = histogram.clone();
let signal_exit = signal_exit.clone();
handlers.push(thread::spawn(move || {
while !signal_exit.load(atomic::Ordering::Relaxed) {
for _ in 0..1_000 {
histogram.observe(1.0);
}
histogram.collect();
}
}));
}
c.bench_function("concurrent_observe_and_collect", |b| {
b.iter(|| histogram.observe(1.0));
});
signal_exit.store(true, atomic::Ordering::Relaxed);
for handler in handlers {
handler.join().unwrap();
}
}
criterion_group!(
benches,
bench_histogram_with_label_values,
bench_histogram_no_labels,
bench_histogram_timer,
bench_histogram_local,
bench_local_histogram_timer,
concurrent_observe_and_collect,
);
criterion_main!(benches);
/*
#[bench]
#[cfg(feature = "nightly")]
fn bench_histogram_coarse_timer(c: &mut Criterion) {
let histogram = Histogram::with_opts(HistogramOpts::new(
"benchmark_histogram_timer",
"A histogram to benchmark it.",
))
.unwrap();
b.iter(|| histogram.start_coarse_timer())
}
#[bench]
#[cfg(feature = "nightly")]
fn bench_local_histogram_coarse_timer(c: &mut Criterion) {
let histogram = Histogram::with_opts(HistogramOpts::new(
"benchmark_histogram_timer",
"A histogram to benchmark it.",
))
.unwrap();
let local = histogram.local();
b.iter(|| local.start_coarse_timer());
local.flush();
}
*/