mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2025-12-23 02:29:57 +00:00
* fix cardinality aggregation performance fix cardinality performance by fetching multiple terms at once. This avoids decompressing the same block and keeps the buffer state between terms. add cardinality aggregation benchmark bump rust version to 1.66 Performance comparison to before (AllQuery) ``` full cardinality_agg Memory: 3.5 MB (-0.00%) Avg: 21.2256ms (-97.78%) Median: 21.0042ms (-97.82%) [20.4717ms .. 23.6206ms] terms_few_with_cardinality_agg Memory: 10.6 MB Avg: 81.9293ms (-97.37%) Median: 81.5526ms (-97.38%) [79.7564ms .. 88.0374ms] dense cardinality_agg Memory: 3.6 MB (-0.00%) Avg: 25.9372ms (-97.24%) Median: 25.7744ms (-97.25%) [24.7241ms .. 27.8793ms] terms_few_with_cardinality_agg Memory: 10.6 MB Avg: 93.9897ms (-96.91%) Median: 92.7821ms (-96.94%) [90.3312ms .. 117.4076ms] sparse cardinality_agg Memory: 895.4 KB (-0.00%) Avg: 22.5113ms (-95.01%) Median: 22.5629ms (-94.99%) [22.1628ms .. 22.9436ms] terms_few_with_cardinality_agg Memory: 680.2 KB Avg: 26.4250ms (-94.85%) Median: 26.4135ms (-94.86%) [26.3210ms .. 26.6774ms] ``` * clippy * assert for sorted ordinals
109 lines
4.0 KiB
Rust
109 lines
4.0 KiB
Rust
use std::sync::Arc;
|
|
|
|
use common::file_slice::FileSlice;
|
|
use common::OwnedBytes;
|
|
use criterion::{criterion_group, criterion_main, Criterion};
|
|
use tantivy_sstable::{Dictionary, MonotonicU64SSTable};
|
|
|
|
fn make_test_sstable(suffix: &str) -> FileSlice {
|
|
let mut builder = Dictionary::<MonotonicU64SSTable>::builder(Vec::new()).unwrap();
|
|
|
|
// 125 mio elements
|
|
for elem in 0..125_000_000 {
|
|
let key = format!("prefix.{elem:07X}{suffix}").into_bytes();
|
|
builder.insert(&key, &elem).unwrap();
|
|
}
|
|
|
|
let table = builder.finish().unwrap();
|
|
let table = Arc::new(OwnedBytes::new(table));
|
|
common::file_slice::FileSlice::new(table.clone())
|
|
}
|
|
|
|
pub fn criterion_benchmark(c: &mut Criterion) {
|
|
{
|
|
let slice = make_test_sstable(".suffix");
|
|
let dict = Dictionary::<MonotonicU64SSTable>::open(slice.clone()).unwrap();
|
|
c.bench_function("ord_to_term_suffix", |b| {
|
|
let mut res = Vec::new();
|
|
b.iter(|| {
|
|
assert!(dict.ord_to_term(100_000, &mut res).unwrap());
|
|
assert!(dict.ord_to_term(19_000_000, &mut res).unwrap());
|
|
})
|
|
});
|
|
c.bench_function("open_and_ord_to_term_suffix", |b| {
|
|
let mut res = Vec::new();
|
|
b.iter(|| {
|
|
let dict = Dictionary::<MonotonicU64SSTable>::open(slice.clone()).unwrap();
|
|
assert!(dict.ord_to_term(100_000, &mut res).unwrap());
|
|
assert!(dict.ord_to_term(19_000_000, &mut res).unwrap());
|
|
})
|
|
});
|
|
c.bench_function("term_ord_suffix", |b| {
|
|
b.iter(|| {
|
|
assert_eq!(
|
|
dict.term_ord(b"prefix.00186A0.suffix").unwrap().unwrap(),
|
|
100_000
|
|
);
|
|
assert_eq!(
|
|
dict.term_ord(b"prefix.121EAC0.suffix").unwrap().unwrap(),
|
|
19_000_000
|
|
);
|
|
})
|
|
});
|
|
c.bench_function("open_and_term_ord_suffix", |b| {
|
|
b.iter(|| {
|
|
let dict = Dictionary::<MonotonicU64SSTable>::open(slice.clone()).unwrap();
|
|
assert_eq!(
|
|
dict.term_ord(b"prefix.00186A0.suffix").unwrap().unwrap(),
|
|
100_000
|
|
);
|
|
assert_eq!(
|
|
dict.term_ord(b"prefix.121EAC0.suffix").unwrap().unwrap(),
|
|
19_000_000
|
|
);
|
|
})
|
|
});
|
|
}
|
|
{
|
|
let slice = make_test_sstable("");
|
|
let dict = Dictionary::<MonotonicU64SSTable>::open(slice.clone()).unwrap();
|
|
c.bench_function("ord_to_term", |b| {
|
|
let mut res = Vec::new();
|
|
b.iter(|| {
|
|
assert!(dict.ord_to_term(100_000, &mut res).unwrap());
|
|
assert!(dict.ord_to_term(19_000_000, &mut res).unwrap());
|
|
})
|
|
});
|
|
c.bench_function("open_and_ord_to_term", |b| {
|
|
let mut res = Vec::new();
|
|
b.iter(|| {
|
|
let dict = Dictionary::<MonotonicU64SSTable>::open(slice.clone()).unwrap();
|
|
assert!(dict.ord_to_term(100_000, &mut res).unwrap());
|
|
assert!(dict.ord_to_term(19_000_000, &mut res).unwrap());
|
|
})
|
|
});
|
|
c.bench_function("term_ord", |b| {
|
|
b.iter(|| {
|
|
assert_eq!(dict.term_ord(b"prefix.00186A0").unwrap().unwrap(), 100_000);
|
|
assert_eq!(
|
|
dict.term_ord(b"prefix.121EAC0").unwrap().unwrap(),
|
|
19_000_000
|
|
);
|
|
})
|
|
});
|
|
c.bench_function("open_and_term_ord", |b| {
|
|
b.iter(|| {
|
|
let dict = Dictionary::<MonotonicU64SSTable>::open(slice.clone()).unwrap();
|
|
assert_eq!(dict.term_ord(b"prefix.00186A0").unwrap().unwrap(), 100_000);
|
|
assert_eq!(
|
|
dict.term_ord(b"prefix.121EAC0").unwrap().unwrap(),
|
|
19_000_000
|
|
);
|
|
})
|
|
});
|
|
}
|
|
}
|
|
|
|
criterion_group!(benches, criterion_benchmark);
|
|
criterion_main!(benches);
|