diff --git a/bench_vec.rs b/bench_vec.rs index 0f7177bc..14f05b71 100644 --- a/bench_vec.rs +++ b/bench_vec.rs @@ -21,22 +21,22 @@ mod decoder { use super::{Error, EndOfStream, SyntaxError}; - pub struct Decoder { + pub struct IntDecoder { len: uint, iter: vec::MoveItems, } - impl Decoder { + impl IntDecoder { #[inline] - pub fn new(values: Vec) -> Decoder { - Decoder { + pub fn new(values: Vec) -> IntDecoder { + IntDecoder { len: values.len(), iter: values.move_iter(), } } } - impl serialize::Decoder for Decoder { + impl serialize::Decoder for IntDecoder { // Primitive types: fn read_nil(&mut self) -> Result<(), Error> { Err(SyntaxError) } fn read_uint(&mut self) -> Result { Err(SyntaxError) } @@ -62,62 +62,163 @@ mod decoder { fn read_str(&mut self) -> Result { Err(SyntaxError) } // Compound types: - fn read_enum(&mut self, _name: &str, _f: |&mut Decoder| -> Result) -> Result { Err(SyntaxError) } + fn read_enum(&mut self, _name: &str, _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_enum_variant(&mut self, _names: &[&str], - _f: |&mut Decoder, uint| -> Result) + _f: |&mut IntDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_enum_variant_arg(&mut self, _a_idx: uint, - _f: |&mut Decoder| -> Result) + _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_enum_struct_variant(&mut self, _names: &[&str], - _f: |&mut Decoder, uint| -> Result) + _f: |&mut IntDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: uint, - _f: |&mut Decoder| -> Result) + _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } - fn read_struct(&mut self, _s_name: &str, _len: uint, _f: |&mut Decoder| -> Result) + fn read_struct(&mut self, _s_name: &str, _len: uint, _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_struct_field(&mut self, _f_name: &str, _f_idx: uint, - _f: |&mut Decoder| -> Result) + _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } - fn read_tuple(&mut self, _f: |&mut Decoder, uint| -> Result) -> Result { Err(SyntaxError) } - fn read_tuple_arg(&mut self, _a_idx: uint, _f: |&mut Decoder| -> Result) -> Result { Err(SyntaxError) } + fn read_tuple(&mut self, _f: |&mut IntDecoder, uint| -> Result) -> Result { Err(SyntaxError) } + fn read_tuple_arg(&mut self, _a_idx: uint, _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_tuple_struct(&mut self, _s_name: &str, - _f: |&mut Decoder, uint| -> Result) + _f: |&mut IntDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_tuple_struct_arg(&mut self, _a_idx: uint, - _f: |&mut Decoder| -> Result) + _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } // Specialized types: - fn read_option(&mut self, _f: |&mut Decoder, bool| -> Result) -> Result { Err(SyntaxError) } + fn read_option(&mut self, _f: |&mut IntDecoder, bool| -> Result) -> Result { Err(SyntaxError) } #[inline] - fn read_seq(&mut self, f: |&mut Decoder, uint| -> Result) -> Result { + fn read_seq(&mut self, f: |&mut IntDecoder, uint| -> Result) -> Result { f(self, self.len) } #[inline] - fn read_seq_elt(&mut self, _idx: uint, f: |&mut Decoder| -> Result) -> Result { + fn read_seq_elt(&mut self, _idx: uint, f: |&mut IntDecoder| -> Result) -> Result { f(self) } - fn read_map(&mut self, _f: |&mut Decoder, uint| -> Result) -> Result { Err(SyntaxError) } - fn read_map_elt_key(&mut self, _idx: uint, _f: |&mut Decoder| -> Result) -> Result { Err(SyntaxError) } - fn read_map_elt_val(&mut self, _idx: uint, _f: |&mut Decoder| -> Result) -> Result { Err(SyntaxError) } + fn read_map(&mut self, _f: |&mut IntDecoder, uint| -> Result) -> Result { Err(SyntaxError) } + fn read_map_elt_key(&mut self, _idx: uint, _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } + fn read_map_elt_val(&mut self, _idx: uint, _f: |&mut IntDecoder| -> Result) -> Result { Err(SyntaxError) } + } + + + pub struct U8Decoder { + len: uint, + iter: vec::MoveItems, + } + + impl U8Decoder { + #[inline] + pub fn new(values: Vec) -> U8Decoder { + U8Decoder { + len: values.len(), + iter: values.move_iter(), + } + } + } + + impl serialize::Decoder for U8Decoder { + // Primitive types: + fn read_nil(&mut self) -> Result<(), Error> { Err(SyntaxError) } + fn read_uint(&mut self) -> Result { Err(SyntaxError) } + fn read_u64(&mut self) -> Result { Err(SyntaxError) } + fn read_u32(&mut self) -> Result { Err(SyntaxError) } + fn read_u16(&mut self) -> Result { Err(SyntaxError) } + #[inline] + fn read_u8(&mut self) -> Result { + match self.iter.next() { + Some(value) => Ok(value), + None => Err(EndOfStream), + } + } + #[inline] + fn read_int(&mut self) -> Result { Err(SyntaxError) } + fn read_i64(&mut self) -> Result { Err(SyntaxError) } + fn read_i32(&mut self) -> Result { Err(SyntaxError) } + fn read_i16(&mut self) -> Result { Err(SyntaxError) } + fn read_i8(&mut self) -> Result { Err(SyntaxError) } + fn read_bool(&mut self) -> Result { Err(SyntaxError) } + fn read_f64(&mut self) -> Result { Err(SyntaxError) } + fn read_f32(&mut self) -> Result { Err(SyntaxError) } + fn read_char(&mut self) -> Result { Err(SyntaxError) } + fn read_str(&mut self) -> Result { Err(SyntaxError) } + + // Compound types: + fn read_enum(&mut self, _name: &str, _f: |&mut U8Decoder| -> Result) -> Result { Err(SyntaxError) } + + fn read_enum_variant(&mut self, + _names: &[&str], + _f: |&mut U8Decoder, uint| -> Result) + -> Result { Err(SyntaxError) } + fn read_enum_variant_arg(&mut self, + _a_idx: uint, + _f: |&mut U8Decoder| -> Result) + -> Result { Err(SyntaxError) } + + fn read_enum_struct_variant(&mut self, + _names: &[&str], + _f: |&mut U8Decoder, uint| -> Result) + -> Result { Err(SyntaxError) } + fn read_enum_struct_variant_field(&mut self, + _f_name: &str, + _f_idx: uint, + _f: |&mut U8Decoder| -> Result) + -> Result { Err(SyntaxError) } + + fn read_struct(&mut self, _s_name: &str, _len: uint, _f: |&mut U8Decoder| -> Result) + -> Result { Err(SyntaxError) } + fn read_struct_field(&mut self, + _f_name: &str, + _f_idx: uint, + _f: |&mut U8Decoder| -> Result) + -> Result { Err(SyntaxError) } + + fn read_tuple(&mut self, _f: |&mut U8Decoder, uint| -> Result) -> Result { Err(SyntaxError) } + fn read_tuple_arg(&mut self, _a_idx: uint, _f: |&mut U8Decoder| -> Result) -> Result { Err(SyntaxError) } + + fn read_tuple_struct(&mut self, + _s_name: &str, + _f: |&mut U8Decoder, uint| -> Result) + -> Result { Err(SyntaxError) } + fn read_tuple_struct_arg(&mut self, + _a_idx: uint, + _f: |&mut U8Decoder| -> Result) + -> Result { Err(SyntaxError) } + + // Specialized types: + fn read_option(&mut self, _f: |&mut U8Decoder, bool| -> Result) -> Result { Err(SyntaxError) } + + #[inline] + fn read_seq(&mut self, f: |&mut U8Decoder, uint| -> Result) -> Result { + f(self, self.len) + } + #[inline] + fn read_seq_elt(&mut self, _idx: uint, f: |&mut U8Decoder| -> Result) -> Result { + f(self) + } + + fn read_map(&mut self, _f: |&mut U8Decoder, uint| -> Result) -> Result { Err(SyntaxError) } + fn read_map_elt_key(&mut self, _idx: uint, _f: |&mut U8Decoder| -> Result) -> Result { Err(SyntaxError) } + fn read_map_elt_val(&mut self, _idx: uint, _f: |&mut U8Decoder| -> Result) -> Result { Err(SyntaxError) } } } @@ -138,16 +239,16 @@ mod deserializer { EndState, } - pub struct Deserializer { + pub struct IntDeserializer { state: State, len: uint, iter: vec::MoveItems, } - impl Deserializer { + impl IntDeserializer { #[inline] - pub fn new(values: Vec) -> Deserializer { - Deserializer { + pub fn new(values: Vec) -> IntDeserializer { + IntDeserializer { state: StartState, len: values.len(), iter: values.move_iter(), @@ -155,7 +256,7 @@ mod deserializer { } } - impl Iterator> for Deserializer { + impl Iterator> for IntDeserializer { #[inline] fn next(&mut self) -> Option> { match self.state { @@ -181,7 +282,62 @@ mod deserializer { } } - impl de::Deserializer for Deserializer { + impl de::Deserializer for IntDeserializer { + #[inline] + fn end_of_stream_error(&self) -> Error { + EndOfStream + } + + #[inline] + fn syntax_error(&self) -> Error { + SyntaxError + } + } + + pub struct U8Deserializer { + state: State, + len: uint, + iter: vec::MoveItems, + } + + impl U8Deserializer { + #[inline] + pub fn new(values: Vec) -> U8Deserializer { + U8Deserializer { + state: StartState, + len: values.len(), + iter: values.move_iter(), + } + } + } + + impl Iterator> for U8Deserializer { + #[inline] + fn next(&mut self) -> Option> { + match self.state { + StartState => { + self.state = SepOrEndState; + Some(Ok(de::SeqStart(self.len))) + } + SepOrEndState => { + match self.iter.next() { + Some(value) => { + Some(Ok(de::U8(value))) + } + None => { + self.state = EndState; + Some(Ok(de::End)) + } + } + } + EndState => { + None + } + } + } + } + + impl de::Deserializer for U8Deserializer { #[inline] fn end_of_stream_error(&self) -> Error { EndOfStream @@ -220,7 +376,7 @@ fn run_deserializer< fn bench_decoder_vec_int_000(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(); - run_decoder(decoder::Decoder::new(v.clone()), v) + run_decoder(decoder::IntDecoder::new(v.clone()), v) }) } @@ -228,7 +384,7 @@ fn bench_decoder_vec_int_000(b: &mut Bencher) { fn bench_deserializer_vec_int_000(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(); - run_deserializer(deserializer::Deserializer::new(v.clone()), v) + run_deserializer(deserializer::IntDeserializer::new(v.clone()), v) }) } @@ -236,7 +392,7 @@ fn bench_deserializer_vec_int_000(b: &mut Bencher) { fn bench_decoder_vec_int_003(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(1, 2, 3); - run_decoder(decoder::Decoder::new(v.clone()), v) + run_decoder(decoder::IntDecoder::new(v.clone()), v) }) } @@ -244,7 +400,7 @@ fn bench_decoder_vec_int_003(b: &mut Bencher) { fn bench_deserializer_vec_int_003(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(1, 2, 3); - run_deserializer(deserializer::Deserializer::new(v.clone()), v) + run_deserializer(deserializer::IntDeserializer::new(v.clone()), v) }) } @@ -252,7 +408,7 @@ fn bench_deserializer_vec_int_003(b: &mut Bencher) { fn bench_decoder_vec_int_100(b: &mut Bencher) { b.iter(|| { let v: Vec = range(0, 100).collect(); - run_decoder(decoder::Decoder::new(v.clone()), v) + run_decoder(decoder::IntDecoder::new(v.clone()), v) }) } @@ -260,6 +416,54 @@ fn bench_decoder_vec_int_100(b: &mut Bencher) { fn bench_deserializer_vec_int_100(b: &mut Bencher) { b.iter(|| { let v: Vec = range(0, 100).collect(); - run_deserializer(deserializer::Deserializer::new(v.clone()), v) + run_deserializer(deserializer::IntDeserializer::new(v.clone()), v) + }) +} + +#[bench] +fn bench_decoder_vec_u8_000(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(); + run_decoder(decoder::U8Decoder::new(v.clone()), v) + }) +} + +#[bench] +fn bench_deserializer_vec_u8_000(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(); + run_deserializer(deserializer::U8Deserializer::new(v.clone()), v) + }) +} + +#[bench] +fn bench_decoder_vec_u8_003(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(1, 2, 3); + run_decoder(decoder::U8Decoder::new(v.clone()), v) + }) +} + +#[bench] +fn bench_deserializer_vec_u8_003(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(1, 2, 3); + run_deserializer(deserializer::U8Deserializer::new(v.clone()), v) + }) +} + +#[bench] +fn bench_decoder_vec_u8_100(b: &mut Bencher) { + b.iter(|| { + let v: Vec = range(0u8, 100).collect(); + run_decoder(decoder::U8Decoder::new(v.clone()), v) + }) +} + +#[bench] +fn bench_deserializer_vec_u8_100(b: &mut Bencher) { + b.iter(|| { + let v: Vec = range(0u8, 100).collect(); + run_deserializer(deserializer::U8Deserializer::new(v.clone()), v) }) }