mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-22 21:59:59 +00:00
This makes it possible for the compiler to validate that a match block matched all PostgreSQL versions we support. ## Problem We did not have a complete picture about which places we had to test against PG versions, and what format these versions were: The full PG version ID format (Major/minor/bugfix `MMmmbb`) as transfered in protocol messages, or only the Major release version (`MM`). This meant type confusion was rampant. With this change, it becomes easier to develop new version-dependent features, by making type and niche confusion impossible. ## Summary of changes Every use of `pg_version` is now typed as either `PgVersionId` (u32, valued in decimal `MMmmbb`) or PgMajorVersion (an enum, with a value for every major version we support, serialized and stored like a u32 with the value of that major version) --------- Co-authored-by: Arpad Müller <arpad-m@users.noreply.github.com>
51 lines
1.8 KiB
Rust
51 lines
1.8 KiB
Rust
use std::ffi::CStr;
|
|
|
|
use criterion::{Bencher, Criterion, criterion_group, criterion_main};
|
|
use postgres_ffi::v17::wal_generator::LogicalMessageGenerator;
|
|
use postgres_ffi::v17::waldecoder_handler::WalStreamDecoderHandler;
|
|
use postgres_ffi::waldecoder::WalStreamDecoder;
|
|
use postgres_versioninfo::PgMajorVersion;
|
|
use pprof::criterion::{Output, PProfProfiler};
|
|
use utils::lsn::Lsn;
|
|
|
|
const KB: usize = 1024;
|
|
|
|
// Register benchmarks with Criterion.
|
|
criterion_group!(
|
|
name = benches;
|
|
config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None)));
|
|
targets = bench_complete_record,
|
|
);
|
|
criterion_main!(benches);
|
|
|
|
/// Benchmarks WalStreamDecoder::complete_record() for a logical message of varying size.
|
|
fn bench_complete_record(c: &mut Criterion) {
|
|
let mut g = c.benchmark_group("complete_record");
|
|
for size in [64, KB, 8 * KB, 128 * KB] {
|
|
// Kind of weird to change the group throughput per benchmark, but it's the only way
|
|
// to vary it per benchmark. It works.
|
|
g.throughput(criterion::Throughput::Bytes(size as u64));
|
|
g.bench_function(format!("size={size}"), |b| run_bench(b, size).unwrap());
|
|
}
|
|
|
|
fn run_bench(b: &mut Bencher, size: usize) -> anyhow::Result<()> {
|
|
const PREFIX: &CStr = c"";
|
|
let value_size = LogicalMessageGenerator::make_value_size(size, PREFIX);
|
|
let value = vec![1; value_size];
|
|
|
|
let mut decoder = WalStreamDecoder::new(Lsn(0), PgMajorVersion::PG17);
|
|
let msg = LogicalMessageGenerator::new(PREFIX, &value)
|
|
.next()
|
|
.unwrap()
|
|
.encode(Lsn(0));
|
|
assert_eq!(msg.len(), size);
|
|
|
|
b.iter(|| {
|
|
let msg = msg.clone(); // Bytes::clone() is cheap
|
|
decoder.complete_record(msg).unwrap();
|
|
});
|
|
|
|
Ok(())
|
|
}
|
|
}
|