serde/benches/json.rs
2015-02-13 10:26:13 -08:00

312 lines
8.7 KiB
Rust

#![feature(core, plugin, test)]
#![plugin(serde_macros)]
extern crate serde;
extern crate "rustc-serialize" as rustc_serialize;
extern crate test;
use std::collections::BTreeMap;
use std::string;
use rustc_serialize as serialize;
use test::Bencher;
use serde::de::Token;
use serde::json::{Parser, Value, from_str};
macro_rules! treemap {
($($k:expr => $v:expr),*) => ({
let mut _m = ::std::collections::BTreeMap::new();
$(_m.insert($k, $v);)*
_m
})
}
fn json_str(count: usize) -> string::String {
let mut src = "[".to_string();
for _ in range(0, count) {
src.push_str(r#"{"a":true,"b":null,"c":3.1415,"d":"Hello world","e":[1,2,3]},"#);
}
src.push_str("{}]");
src
}
fn pretty_json_str(count: usize) -> string::String {
let mut src = "[\n".to_string();
for _ in range(0, count) {
src.push_str(
concat!(
" {\n",
" \"a\": true,\n",
" \"b\": null,\n",
" \"c\": 3.1415,\n",
" \"d\": \"Hello world\",\n",
" \"e\": [\n",
" 1,\n",
" 2,\n",
" 3\n",
" ]\n",
" },\n"
)
);
}
src.push_str(" {}\n]");
src
}
fn encoder_json(count: usize) -> serialize::json::Json {
use rustc_serialize::json::Json;
let mut list = vec!();
for _ in range(0, count) {
list.push(Json::Object(treemap!(
"a".to_string() => Json::Boolean(true),
"b".to_string() => Json::Null,
"c".to_string() => Json::F64(3.1415),
"d".to_string() => Json::String("Hello world".to_string()),
"e".to_string() => Json::Array(vec!(
Json::U64(1),
Json::U64(2),
Json::U64(3)
))
)));
}
list.push(Json::Object(BTreeMap::new()));
Json::Array(list)
}
fn serializer_json(count: usize) -> Value {
let mut list = vec!();
for _ in range(0, count) {
list.push(Value::Object(treemap!(
"a".to_string() => Value::Boolean(true),
"b".to_string() => Value::Null,
"c".to_string() => Value::Floating(3.1415),
"d".to_string() => Value::String("Hello world".to_string()),
"e".to_string() => Value::Array(vec!(
Value::Integer(1),
Value::Integer(2),
Value::Integer(3)
))
)));
}
list.push(Value::Object(BTreeMap::new()));
Value::Array(list)
}
fn bench_encoder(b: &mut Bencher, count: usize) {
let src = json_str(count);
let json = encoder_json(count);
b.iter(|| {
assert_eq!(json.to_string(), src);
});
}
fn bench_encoder_pretty(b: &mut Bencher, count: usize) {
let src = pretty_json_str(count);
let json = encoder_json(count);
b.iter(|| {
assert_eq!(json.pretty().to_string(), src);
});
}
fn bench_serializer(b: &mut Bencher, count: usize) {
let src = json_str(count);
let json = serializer_json(count);
b.iter(|| {
assert_eq!(json.to_string(), src);
});
}
fn bench_serializer_pretty(b: &mut Bencher, count: usize) {
let src = pretty_json_str(count);
let json = serializer_json(count);
b.iter(|| {
assert_eq!(json.to_pretty_string(), src);
});
}
fn bench_decoder(b: &mut Bencher, count: usize) {
let src = json_str(count);
let json = encoder_json(count);
b.iter(|| {
assert_eq!(json, serialize::json::Json::from_str(&src).unwrap());
});
}
fn bench_deserializer(b: &mut Bencher, count: usize) {
let src = json_str(count);
let json = encoder_json(count);
b.iter(|| {
assert_eq!(json, serialize::json::Json::from_str(&src).unwrap());
});
}
fn bench_decoder_streaming(b: &mut Bencher, count: usize) {
let src = json_str(count);
b.iter( || {
use rustc_serialize::json::{Parser, JsonEvent, StackElement};
let mut parser = Parser::new(src.chars());
assert_eq!(parser.next(), Some(JsonEvent::ArrayStart));
for _ in range(0, count) {
assert_eq!(parser.next(), Some(JsonEvent::ObjectStart));
assert_eq!(parser.next(), Some(JsonEvent::BooleanValue(true)));
assert_eq!(parser.stack().top(), Some(StackElement::Key("a")));
assert_eq!(parser.next(), Some(JsonEvent::NullValue));
assert_eq!(parser.stack().top(), Some(StackElement::Key("b")));
assert_eq!(parser.next(), Some(JsonEvent::F64Value(3.1415)));
assert_eq!(parser.stack().top(), Some(StackElement::Key("c")));
assert_eq!(parser.next(), Some(JsonEvent::StringValue("Hello world".to_string())));
assert_eq!(parser.stack().top(), Some(StackElement::Key("d")));
assert_eq!(parser.next(), Some(JsonEvent::ArrayStart));
assert_eq!(parser.stack().top(), Some(StackElement::Key("e")));
assert_eq!(parser.next(), Some(JsonEvent::U64Value(1)));
assert_eq!(parser.next(), Some(JsonEvent::U64Value(2)));
assert_eq!(parser.next(), Some(JsonEvent::U64Value(3)));
assert_eq!(parser.next(), Some(JsonEvent::ArrayEnd));
assert_eq!(parser.next(), Some(JsonEvent::ObjectEnd));
}
assert_eq!(parser.next(), Some(JsonEvent::ObjectStart));
assert_eq!(parser.next(), Some(JsonEvent::ObjectEnd));
assert_eq!(parser.next(), Some(JsonEvent::ArrayEnd));
assert_eq!(parser.next(), None);
});
}
fn bench_deserializer_streaming(b: &mut Bencher, count: usize) {
let src = json_str(count);
b.iter( || {
let mut parser = Parser::new(src.bytes());
assert_eq!(parser.next(), Some(Ok(Token::SeqStart(0))));
for _ in range(0, count) {
assert_eq!(parser.next(), Some(Ok(Token::MapStart(0))));
assert_eq!(parser.next(), Some(Ok(Token::String("a".to_string()))));
assert_eq!(parser.next(), Some(Ok(Token::Bool(true))));
assert_eq!(parser.next(), Some(Ok(Token::String("b".to_string()))));
assert_eq!(parser.next(), Some(Ok(Token::Null)));
assert_eq!(parser.next(), Some(Ok(Token::String("c".to_string()))));
assert_eq!(parser.next(), Some(Ok(Token::F64(3.1415))));
assert_eq!(parser.next(), Some(Ok(Token::String("d".to_string()))));
assert_eq!(parser.next(), Some(Ok(Token::String("Hello world".to_string()))));
assert_eq!(parser.next(), Some(Ok(Token::String("e".to_string()))));
assert_eq!(parser.next(), Some(Ok(Token::SeqStart(0))));
assert_eq!(parser.next(), Some(Ok(Token::I64(1))));
assert_eq!(parser.next(), Some(Ok(Token::I64(2))));
assert_eq!(parser.next(), Some(Ok(Token::I64(3))));
assert_eq!(parser.next(), Some(Ok(Token::End)));
assert_eq!(parser.next(), Some(Ok(Token::End)));
}
assert_eq!(parser.next(), Some(Ok(Token::MapStart(0))));
assert_eq!(parser.next(), Some(Ok(Token::End)));
assert_eq!(parser.next(), Some(Ok(Token::End)));
assert_eq!(parser.next(), None);
loop {
match parser.next() {
None => return,
Some(Ok(_)) => { }
Some(Err(err)) => { panic!("error: {:?}", err); }
}
}
});
}
#[bench]
fn bench_encoder_001(b: &mut Bencher) {
bench_encoder(b, 1)
}
#[bench]
fn bench_encoder_500(b: &mut Bencher) {
bench_encoder(b, 500)
}
#[bench]
fn bench_encoder_001_pretty(b: &mut Bencher) {
bench_encoder_pretty(b, 1)
}
#[bench]
fn bench_encoder_500_pretty(b: &mut Bencher) {
bench_encoder_pretty(b, 500)
}
#[bench]
fn bench_serializer_001(b: &mut Bencher) {
bench_serializer(b, 1)
}
#[bench]
fn bench_serializer_500(b: &mut Bencher) {
bench_serializer(b, 500)
}
#[bench]
fn bench_serializer_001_pretty(b: &mut Bencher) {
bench_serializer_pretty(b, 1)
}
#[bench]
fn bench_serializer_500_pretty(b: &mut Bencher) {
bench_serializer_pretty(b, 500)
}
#[bench]
fn bench_decoder_001(b: &mut Bencher) {
bench_decoder(b, 1)
}
#[bench]
fn bench_decoder_500(b: &mut Bencher) {
bench_decoder(b, 500)
}
#[bench]
fn bench_deserializer_001(b: &mut Bencher) {
bench_deserializer(b, 1)
}
#[bench]
fn bench_deserializer_500(b: &mut Bencher) {
bench_deserializer(b, 500)
}
#[bench]
fn bench_decoder_001_streaming(b: &mut Bencher) {
bench_decoder_streaming(b, 1)
}
#[bench]
fn bench_decoder_500_streaming(b: &mut Bencher) {
bench_decoder_streaming(b, 500)
}
#[bench]
fn bench_deserializer_001_streaming(b: &mut Bencher) {
bench_deserializer_streaming(b, 1)
}
#[bench]
fn bench_deserializer_500_streaming(b: &mut Bencher) {
bench_deserializer_streaming(b, 500)
}