#[macro_use] extern crate criterion; use criterion::{BenchmarkId, Criterion}; use rust_decimal::prelude::FromPrimitive; use sfv::{BareItem, Decimal, Parser, SerializeValue}; use sfv::{RefBareItem, RefDictSerializer, RefItemSerializer, RefListSerializer}; criterion_main!(parsing, serializing, ref_serializing); criterion_group!(parsing, parsing_item, parsing_list, parsing_dict); fn parsing_item(c: &mut Criterion) { let fixture = "c29tZXZlcnlsb25nc3RyaW5ndmFsdWVyZXByZXNlbnRlZGFzYnl0ZXNhbnNvbWVvdGhlcmxvbmdsaW5l"; c.bench_with_input( BenchmarkId::new("parsing_item", fixture), &fixture, move |bench, &input| { bench.iter(|| Parser::parse_item(input.as_bytes()).unwrap()); }, ); } fn parsing_list(c: &mut Criterion) { let fixture = "a, abcdefghigklmnoprst, 123456785686457, 99999999999.999, (), (\"somelongstringvalue\" \"anotherlongstringvalue\";key=:c29tZXZlciBsb25nc3RyaW5ndmFsdWVyZXByZXNlbnRlZGFzYnl0ZXM: 145)"; c.bench_with_input( BenchmarkId::new("parsing_list", fixture), &fixture, move |bench, &input| { bench.iter(|| Parser::parse_list(input.as_bytes()).unwrap()); }, ); } fn parsing_dict(c: &mut Criterion) { let fixture = "a, dict_key2=abcdefghigklmnoprst, dict_key3=123456785686457, dict_key4=(\"inner-list-member\" :aW5uZXItbGlzdC1tZW1iZXI=:);key=aW5uZXItbGlzdC1wYXJhbWV0ZXJz"; c.bench_with_input( BenchmarkId::new("parsing_dict", fixture), &fixture, move |bench, &input| { bench.iter(|| Parser::parse_dictionary(input.as_bytes()).unwrap()); }, ); } criterion_group!( serializing, serializing_item, serializing_list, serializing_dict ); fn serializing_item(c: &mut Criterion) { let fixture = "c29tZXZlcnlsb25nc3RyaW5ndmFsdWVyZXByZXNlbnRlZGFzYnl0ZXNhbnNvbWVvdGhlcmxvbmdsaW5l"; c.bench_with_input( BenchmarkId::new("serializing_item", fixture), &fixture, move |bench, &input| { let parsed_item = Parser::parse_item(input.as_bytes()).unwrap(); bench.iter(|| parsed_item.serialize_value().unwrap()); }, ); } fn serializing_list(c: &mut Criterion) { let fixture = "a, abcdefghigklmnoprst, 123456785686457, 99999999999.999, (), (\"somelongstringvalue\" \"anotherlongstringvalue\";key=:c29tZXZlciBsb25nc3RyaW5ndmFsdWVyZXByZXNlbnRlZGFzYnl0ZXM: 145)"; c.bench_with_input( BenchmarkId::new("serializing_list", fixture), &fixture, move |bench, &input| { let parsed_list = Parser::parse_list(input.as_bytes()).unwrap(); bench.iter(|| parsed_list.serialize_value().unwrap()); }, ); } fn serializing_dict(c: &mut Criterion) { let fixture = "a, dict_key2=abcdefghigklmnoprst, dict_key3=123456785686457, dict_key4=(\"inner-list-member\" :aW5uZXItbGlzdC1tZW1iZXI=:);key=aW5uZXItbGlzdC1wYXJhbWV0ZXJz"; c.bench_with_input( BenchmarkId::new("serializing_dict", fixture), &fixture, move |bench, &input| { let parsed_dict = Parser::parse_dictionary(input.as_bytes()).unwrap(); bench.iter(|| parsed_dict.serialize_value().unwrap()); }, ); } criterion_group!( ref_serializing, serializing_ref_item, serializing_ref_list, serializing_ref_dict ); fn serializing_ref_item(c: &mut Criterion) { let fixture = "c29tZXZlcnlsb25nc3RyaW5ndmFsdWVyZXByZXNlbnRlZGFzYnl0ZXNhbnNvbWVvdGhlcmxvbmdsaW5l"; c.bench_with_input( BenchmarkId::new("serializing_ref_item", fixture), &fixture, move |bench, &input| { bench.iter(|| { let mut output = String::new(); let ser = RefItemSerializer::new(&mut output); ser.bare_item(&RefBareItem::ByteSeq(input.as_bytes())) .unwrap(); }); }, ); } fn serializing_ref_list(c: &mut Criterion) { c.bench_function("serializing_ref_list", move |bench| { bench.iter(|| { let mut output = String::new(); let ser = RefListSerializer::new(&mut output); ser.bare_item(&RefBareItem::Token("a")) .unwrap() .bare_item(&RefBareItem::Token("abcdefghigklmnoprst")) .unwrap() .bare_item(&RefBareItem::Integer(123456785686457)) .unwrap() .bare_item(&RefBareItem::Decimal( Decimal::from_f64(99999999999.999).unwrap(), )) .unwrap() .open_inner_list() .close_inner_list() .open_inner_list() .inner_list_bare_item(&RefBareItem::String("somelongstringvalue")) .unwrap() .inner_list_bare_item(&RefBareItem::String("anotherlongstringvalue")) .unwrap() .inner_list_parameter( "key", &RefBareItem::ByteSeq("somever longstringvaluerepresentedasbytes".as_bytes()), ) .unwrap() .inner_list_bare_item(&RefBareItem::Integer(145)) .unwrap() .close_inner_list(); }); }); } fn serializing_ref_dict(c: &mut Criterion) { c.bench_function("serializing_ref_dict", move |bench| { bench.iter(|| { let mut output = String::new(); RefDictSerializer::new(&mut output) .bare_item_member("a", &RefBareItem::Boolean(true)) .unwrap() .bare_item_member("dict_key2", &RefBareItem::Token("abcdefghigklmnoprst")) .unwrap() .bare_item_member("dict_key3", &RefBareItem::Integer(123456785686457)) .unwrap() .open_inner_list("dict_key4") .unwrap() .inner_list_bare_item(&RefBareItem::String("inner-list-member")) .unwrap() .inner_list_bare_item(&RefBareItem::ByteSeq("inner-list-member".as_bytes())) .unwrap() .close_inner_list() .parameter("key", &RefBareItem::Token("aW5uZXItbGlzdC1wYXJhbWV0ZXJz")) .unwrap(); }); }); }