use bendy::{
decoding::{Error as DecodingError, FromBencode, Object},
encoding::{Error as EncodingError, SingleItemEncoder, ToBencode},
};
struct PerformanceTestSubject<T>
where
T: FromBencode,
{
list: Vec<Vec<T>>,
}
impl<T> PerformanceTestSubject<T>
where
T: ToBencode + FromBencode,
{
fn serialize(&self) -> Vec<u8> {
self.to_bencode().unwrap()
}
fn deserialize(bytes: Vec<u8>) -> Self {
PerformanceTestSubject::<T>::from_bencode(&bytes).unwrap()
}
}
impl<T> ToBencode for PerformanceTestSubject<T>
where
T: ToBencode + FromBencode,
{
const MAX_DEPTH: usize = 2;
fn encode(&self, encoder: SingleItemEncoder) -> Result<(), EncodingError> {
encoder.emit(&self.list)
}
}
impl<T> FromBencode for PerformanceTestSubject<T>
where
T: FromBencode,
{
const EXPECTED_RECURSION_DEPTH: usize = 2;
fn decode_bencode_object(object: Object) -> Result<Self, DecodingError>
where
Self: Sized,
{
Ok(PerformanceTestSubject {
list: Vec::<Vec<T>>::decode_bencode_object(object)?,
})
}
}
#[macro_use]
extern crate timeit;
#[test]
fn this_should_take_long() {
const LIST_SIZE: usize = 1000;
let test_subject = PerformanceTestSubject::<u32> {
list: vec![vec![69; LIST_SIZE]; LIST_SIZE],
};
timeit!({
test_subject.serialize();
});
let serialized = test_subject.serialize();
timeit!({
PerformanceTestSubject::<u32>::deserialize(serialized.clone());
});
}