Files
core/test/rust/performance/bytes/mod.rs
T
2026-11-03 03:32:07 +00:00

171 lines
4.6 KiB
Rust

fn byte_fault() -> Fault {
&FaultInfo {
message: "byte conversion failed",
source: "reference.dever",
line: 1,
column: 1,
}
}
fn total_reference(values: &dever_runtime::Bytes) -> Result<i64, Fault> {
values.iter().try_fold(0i64, |total, value| {
total.checked_add(i64::from(*value)).ok_or_else(byte_fault)
})
}
fn each_reference(values: &dever_runtime::Bytes) -> Result<Vec<i64>, Fault> {
values
.iter()
.map(|value| i64::from(*value).checked_add(1).ok_or_else(byte_fault))
.collect()
}
fn encode_generated(values: &[String]) -> Result<dever_runtime::Bytes, Fault> {
GENERATED_ENCODE(values.first().map(String::as_str).unwrap_or(""))
}
fn encode_reference(values: &[String]) -> Result<dever_runtime::Bytes, Fault> {
Ok(values
.first()
.map(String::as_str)
.unwrap_or("")
.as_bytes()
.to_vec()
.into())
}
fn decode_generated(values: &dever_runtime::Bytes) -> Result<String, Fault> {
GENERATED_DECODE(values).map_err(|_| byte_fault())
}
fn decode_reference(values: &dever_runtime::Bytes) -> Result<String, Fault> {
std::str::from_utf8(values)
.map(str::to_owned)
.map_err(|_| byte_fault())
}
fn convert_generated(values: &[i64]) -> Result<dever_runtime::Bytes, Fault> {
GENERATED_CONVERT(values).map_err(|_| byte_fault())
}
fn convert_reference(values: &[i64]) -> Result<dever_runtime::Bytes, Fault> {
values
.iter()
.map(|value| u8::try_from(*value).map_err(|_| byte_fault()))
.collect::<Result<Vec<_>, _>>()
.map(Into::into)
}
fn slice_generated(values: &dever_runtime::Bytes) -> Result<dever_runtime::Bytes, Fault> {
GENERATED_SLICE(values).map_err(|_| byte_fault())
}
fn slice_reference(values: &dever_runtime::Bytes) -> Result<dever_runtime::Bytes, Fault> {
values
.get(0..values.len())
.map(<[u8]>::to_vec)
.map(Into::into)
.ok_or_else(byte_fault)
}
fn join_reference(values: &dever_runtime::Bytes) -> Result<dever_runtime::Bytes, Fault> {
let mut result = Vec::with_capacity(values.len() + values.len());
result.extend_from_slice(values);
result.extend_from_slice(values);
Ok(result.into())
}
fn roundtrip_generated(values: &[String]) -> Result<String, Fault> {
GENERATED_ROUNDTRIP(values.first().map(String::as_str).unwrap_or("")).map_err(|_| byte_fault())
}
fn roundtrip_reference(values: &[String]) -> Result<String, Fault> {
let bytes = values
.first()
.map(String::as_str)
.unwrap_or("")
.as_bytes()
.to_vec();
String::from_utf8(bytes).map_err(|_| byte_fault())
}
fn main() {
let text = "hello 雪🙂 ".repeat(256);
let texts = [text];
let bytes = dever_runtime::Bytes::copy_from_slice(texts[0].as_bytes());
let integers: Vec<i64> = (0..1024).map(|value| value % 256).collect();
let invalid = dever_runtime::Bytes::from_static(&[255]);
assert!(decode_generated(&invalid).is_err());
assert!(decode_reference(&invalid).is_err());
assert_eq!(GENERATED_IDENTITY(&bytes).unwrap().as_ptr(), bytes.as_ptr());
assert!(convert_generated(&[-1]).is_err());
assert!(convert_reference(&[-1]).is_err());
assert!(convert_generated(&[256]).is_err());
assert!(convert_reference(&[256]).is_err());
println!("case,sample,implementation,elapsed_ns,checksum");
compare_bytes(
"bytes_reduce",
&bytes,
2000,
GENERATED_TOTAL,
total_reference,
|value| *value as u64,
);
compare_bytes(
"bytes_each",
&bytes,
2000,
GENERATED_EACH,
each_reference,
|value| value.len() as u64,
);
compare(
"bytes_encode",
&texts,
20000,
encode_generated,
encode_reference,
|value| value.len() as u64,
);
compare_bytes(
"bytes_decode",
&bytes,
4000,
decode_generated,
decode_reference,
|value| value.len() as u64,
);
compare(
"bytes_from_ints",
&integers,
2000,
convert_generated,
convert_reference,
|value| value.len() as u64,
);
compare_bytes(
"bytes_slice",
&bytes,
20000,
slice_generated,
slice_reference,
|value| value.len() as u64,
);
compare_bytes(
"bytes_concat",
&bytes,
10000,
GENERATED_JOIN,
join_reference,
|value| value.len() as u64,
);
compare(
"bytes_roundtrip",
&texts,
4000,
roundtrip_generated,
roundtrip_reference,
|value| value.len() as u64,
);
}