Initial Dever 0.0.1
This commit is contained in:
commit
81233d098c
1479 files changed
+163782
No files matched your search
@@ -0,0 +1,56 @@
|
||||
use std::hint::black_box;
|
||||
use std::time::Instant;
|
||||
|
||||
#[inline(never)]
|
||||
fn measure<const BORROW: bool, Input: ?Sized, Output: std::fmt::Debug>(operation: fn(&Input) -> Result<Output, Fault>, values: &Input, count: usize, score: fn(&Output) -> u64) -> (u128, u64) {
|
||||
let operation = black_box(operation);
|
||||
let start = Instant::now();
|
||||
let mut checksum = 0u64;
|
||||
for _ in 0..count {
|
||||
if BORROW {
|
||||
// 保留 Result,通过借用观察输出,隔离取出所有权时的元数据搬运。
|
||||
// 屏障只接收计分值;传入内部引用会使计时环重读 Result 标签并额外访存。
|
||||
let value = operation(black_box(values));
|
||||
checksum = checksum.wrapping_add(black_box(score(value.as_ref().unwrap())));
|
||||
} else {
|
||||
let value = black_box(operation(black_box(values)).unwrap());
|
||||
checksum = checksum.wrapping_add(score(&value));
|
||||
}
|
||||
}
|
||||
(start.elapsed().as_nanos(), checksum)
|
||||
}
|
||||
|
||||
fn compare<Input, Output: PartialEq + std::fmt::Debug>(name: &str, values: &[Input], count: usize, generated: fn(&[Input]) -> Result<Output, Fault>, reference: fn(&[Input]) -> Result<Output, Fault>, score: fn(&Output) -> u64) {
|
||||
compare_named(name, values, count, generated, reference, score, "rust");
|
||||
}
|
||||
|
||||
fn compare_named<Input, Output: PartialEq + std::fmt::Debug>(name: &str, values: &[Input], count: usize, generated: fn(&[Input]) -> Result<Output, Fault>, reference: fn(&[Input]) -> Result<Output, Fault>, score: fn(&Output) -> u64, reference_name: &str) {
|
||||
compare_output::<false, _, _>(name, values, &[], count, generated, reference, score, reference_name);
|
||||
}
|
||||
|
||||
fn compare_borrowed<Input, Output: PartialEq + std::fmt::Debug>(name: &str, values: &[Input], count: usize, generated: fn(&[Input]) -> Result<Output, Fault>, reference: fn(&[Input]) -> Result<Output, Fault>, score: fn(&Output) -> u64) {
|
||||
compare_output::<true, _, _>(&format!("{name}_borrowed"), values, &[], count, generated, reference, score, "rust");
|
||||
}
|
||||
|
||||
fn compare_bytes<Output: PartialEq + std::fmt::Debug>(name: &str, values: &dever_runtime::Bytes, count: usize, generated: fn(&dever_runtime::Bytes) -> Result<Output, Fault>, reference: fn(&dever_runtime::Bytes) -> Result<Output, Fault>, score: fn(&Output) -> u64) {
|
||||
compare_output::<false, _, _>(name, values, &dever_runtime::Bytes::new(), count, generated, reference, score, "rust");
|
||||
}
|
||||
|
||||
fn compare_output<const BORROW: bool, Input: ?Sized, Output: PartialEq + std::fmt::Debug>(name: &str, values: &Input, empty: &Input, count: usize, generated: fn(&Input) -> Result<Output, Fault>, reference: fn(&Input) -> Result<Output, Fault>, score: fn(&Output) -> u64, reference_name: &str) {
|
||||
assert_eq!(generated(values).unwrap(), reference(values).unwrap());
|
||||
assert_eq!(generated(empty).unwrap(), reference(empty).unwrap());
|
||||
for operation in [generated, reference] { black_box(measure::<BORROW, _, _>(operation, values, 2000, score)); }
|
||||
for sample in 0..15 {
|
||||
// 每个标签各占首、中、末位五次,并交替正反顺序,避免固定前后关系。
|
||||
let mut order = [("dever", generated), (reference_name, reference), ("control", generated)];
|
||||
order.rotate_left(sample % 3);
|
||||
if sample / 3 % 2 == 1 { order.swap(0, 1); }
|
||||
let mut expected = None;
|
||||
for (implementation, operation) in order {
|
||||
let (elapsed, checksum) = measure::<BORROW, _, _>(operation, values, count, score);
|
||||
if let Some(expected) = expected { assert_eq!(checksum, expected); }
|
||||
expected = Some(checksum);
|
||||
println!("{name},{sample},{implementation},{elapsed},{checksum}");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user