93 lines
2.8 KiB
Rust
93 lines
2.8 KiB
Rust
// SQLite、资源作用域和优化参数两侧一致;只比较生成层,不推断完整语言或 HTTP 吞吐。
|
|
use dever_runtime::{
|
|
database::{Context as DbContext, Parameter, Registry},
|
|
task::{Limits, Runtime, Scope},
|
|
};
|
|
use std::{
|
|
hint::black_box,
|
|
path::{Path, PathBuf},
|
|
sync::Arc,
|
|
time::Instant,
|
|
};
|
|
|
|
struct BenchDirectory(PathBuf);
|
|
|
|
impl Drop for BenchDirectory {
|
|
fn drop(&mut self) {
|
|
std::fs::remove_dir_all(&self.0).unwrap();
|
|
}
|
|
}
|
|
|
|
fn directory(name: &str, extra: &str) -> (BenchDirectory, PathBuf) {
|
|
let unique = std::time::SystemTime::now()
|
|
.duration_since(std::time::UNIX_EPOCH)
|
|
.unwrap()
|
|
.as_nanos();
|
|
let relative = format!("{name}-benchmark-{}-{unique}", std::process::id());
|
|
let directory = BenchDirectory(
|
|
std::env::current_exe()
|
|
.unwrap()
|
|
.parent()
|
|
.unwrap()
|
|
.join(&relative),
|
|
);
|
|
std::fs::create_dir(&directory.0).unwrap();
|
|
let settings = directory.0.join("setting.json");
|
|
std::fs::write(&settings, format!(r#"{{"database":{{"default":{{"type":"sqlite","path":"{relative}/case.db","max_connections":1,"max_page_size":2048}}}},{extra}}}"#)).unwrap();
|
|
(directory, settings)
|
|
}
|
|
|
|
fn runtime() -> Runtime {
|
|
Runtime::new(Limits {
|
|
threads: 1,
|
|
workers: 1,
|
|
tasks: 16,
|
|
})
|
|
.unwrap()
|
|
}
|
|
|
|
fn smoke() -> bool {
|
|
std::env::args().any(|value| value == "--smoke")
|
|
}
|
|
|
|
fn samples(name: &str, mut measure: impl FnMut(bool, usize) -> (u128, u64)) {
|
|
if let Ok(selected) = std::env::var("DEVER_BENCH_CASES")
|
|
&& !selected.split(',').any(|case| case == name)
|
|
{
|
|
return;
|
|
}
|
|
let (rounds, count) = if smoke() { (1, 4) } else { (15, 2000) };
|
|
if !smoke() {
|
|
for generated in [true, false] {
|
|
black_box(measure(generated, 200));
|
|
}
|
|
}
|
|
for sample in 0..rounds {
|
|
let mut order = [("dever", true), ("rust", false), ("control", true)];
|
|
order.rotate_left(sample % 3);
|
|
let mut expected = None;
|
|
for (implementation, generated) in order {
|
|
let (elapsed, checksum) = measure(generated, count);
|
|
if let Some(expected) = expected {
|
|
assert_eq!(checksum, expected);
|
|
}
|
|
expected = Some(checksum);
|
|
if !smoke() {
|
|
println!("{name},{sample},{implementation},{elapsed},{checksum}");
|
|
}
|
|
}
|
|
}
|
|
if smoke() {
|
|
println!("correctness smoke passed: {name}; no performance result collected");
|
|
}
|
|
}
|
|
|
|
fn header() {
|
|
eprintln!(
|
|
"Rust 1.95.0; release fat LTO; codegen-units=1; overflow-checks=true; SQLite WAL/NORMAL; one connection; one runtime worker; setup/checks excluded"
|
|
);
|
|
if !smoke() {
|
|
println!("case,sample,implementation,nanoseconds,checksum");
|
|
}
|
|
}
|