// #![feature(custom_derive)] // #![feature(custom_attribute)] #![feature(test)] // #![feature(plugin)] // #![plugin(serde_macros)] // for the Country enum // #![recursion_limit="259"] extern crate json; extern crate test; // extern crate serde; // extern crate serde_json; // extern crate rustc_serialize; // extern crate num_traits; #[macro_use] // mod macros; use test::Bencher; // #[derive(Debug, PartialEq, RustcEncodable, RustcDecodable, Serialize, Deserialize)] // struct Http { // protocol: HttpProtocol, // status: u32, // host_status: u32, // up_status: u32, // method: HttpMethod, // content_type: String, // user_agent: String, // referer: String, // request_uri: String, // } // c_enum!(HttpProtocol { // HTTP_PROTOCOL_UNKNOWN, // HTTP10, // HTTP11, // }); // c_enum!(HttpMethod { // METHOD_UNKNOWN, // GET, // POST, // DELETE, // PUT, // HEAD, // PURGE, // OPTIONS, // PROPFIND, // MKCOL, // PATCH, // }); // c_enum!(CacheStatus { // CACHESTATUS_UNKNOWN, // Miss, // Expired, // Hit, // }); // #[derive(Debug, PartialEq, RustcEncodable, RustcDecodable, Serialize, Deserialize)] // struct Origin { // ip: String, // port: u32, // hostname: String, // protocol: OriginProtocol, // } // c_enum!(OriginProtocol { // ORIGIN_PROTOCOL_UNKNOWN, // HTTP, // HTTPS, // }); // c_enum!(ZonePlan { // ZONEPLAN_UNKNOWN, // FREE, // PRO, // BIZ, // ENT, // }); // c_enum!(Country { // UNKNOWN, // A1, A2, O1, AD, AE, AF, AG, AI, AL, AM, AO, AP, AQ, AR, AS, AT, AU, AW, AX, // AZ, BA, BB, BD, BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BS, BT, BV, // BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, CL, CM, CN, CO, CR, CU, CV, CW, // CX, CY, CZ, DE, DJ, DK, DM, DO, DZ, EC, EE, EG, EH, ER, ES, ET, EU, FI, FJ, // FK, FM, FO, FR, GA, GB, GD, GE, GF, GG, GH, GI, GL, GM, GN, GP, GQ, GR, GS, // GT, GU, GW, GY, HK, HM, HN, HR, HT, HU, ID, IE, IL, IM, IN, IO, IQ, IR, IS, // IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ, LA, LB, LC, // LI, LK, LR, LS, LT, LU, LV, LY, MA, MC, MD, ME, MF, MG, MH, MK, ML, MM, MN, // MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, // NO, NP, NR, NU, NZ, OM, PA, PE, PF, PG, PH, PK, PL, PM, PN, PR, PS, PT, PW, // PY, QA, RE, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SJ, SK, SL, SM, // SN, SO, SR, SS, ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, // TO, TR, TT, TV, TW, TZ, UA, UG, UM, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, // WF, WS, XX, YE, YT, ZA, ZM, ZW, // }); // #[derive(Debug, PartialEq, RustcEncodable, RustcDecodable, Serialize, Deserialize)] // struct Log { // timestamp: i64, // zone_id: u32, // zone_plan: ZonePlan, // http: Http, // origin: Origin, // country: Country, // cache_status: CacheStatus, // server_ip: String, // server_name: String, // remote_ip: String, // bytes_dlv: u64, // ray_id: String, // } const JSON_STR: &'static str = r#"{"timestamp":2837513946597,"zone_id":123456,"zone_plan":1,"http":{"protocol":2,"status":200,"host_status":503,"up_status":520,"method":1,"content_type":"text/html","user_agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36","referer":"https://www.cloudflare.com/","request_uri":"/cdn-cgi/trace"},"origin":{"ip":"1.2.3.4","port":8000,"hostname":"www.example.com","protocol":2},"country":238,"cache_status":3,"server_ip":"192.168.1.1","server_name":"metal.cloudflare.com","remote_ip":"10.1.2.3","bytes_dlv":123456,"ray_id":"10c73629cce30078-LAX"}"#; const JSON_FLOAT_STR: &'static str = r#"[[-65.613616999999977,43.420273000000009],[-65.619720000000029,43.418052999999986],[-65.625,43.421379000000059],[-65.636123999999882,43.449714999999969],[-65.633056999999951,43.474709000000132],[-65.611389000000031,43.513054000000068],[-65.605835000000013,43.516105999999979],[-65.598343,43.515830999999935],[-65.566101000000003,43.508331000000055],[-65.561935000000005,43.504439999999988],[-65.55999799999995,43.499718000000087],[-65.573333999999988,43.476379000000065],[-65.593612999999948,43.444153000000028],[-65.613616999999977,43.420273000000009],[-59.816947999999911,43.928328999999962],[-59.841667000000029,43.918602000000021],[-59.866393999999957,43.909987999999998],[-59.879722999999956,43.906654000000003],[-59.895835999999974,43.904160000000047]]"#; // #[bench] // fn rustc_serialize_parse(b: &mut Bencher) { // b.bytes = JSON_STR.len() as u64; // b.iter(|| { // rustc_serialize::json::Json::from_str(JSON_STR).unwrap() // }); // } // #[bench] // fn rustc_serialize_stringify(b: &mut Bencher) { // let data = rustc_serialize::json::Json::from_str(JSON_STR).unwrap(); // b.bytes = rustc_serialize::json::encode(&data).unwrap().len() as u64; // b.iter(|| { // rustc_serialize::json::encode(&data).unwrap(); // }) // } // #[bench] // fn rustc_serialize_struct_parse(b: &mut Bencher) { // use rustc_serialize::json::Json; // b.bytes = JSON_STR.len() as u64; // b.iter(|| { // let json = Json::from_str(JSON_STR).unwrap(); // let mut decoder = rustc_serialize::json::Decoder::new(json); // let log: Log = rustc_serialize::Decodable::decode(&mut decoder).unwrap(); // log // }); // } // #[bench] // fn rustc_serialize_struct_stringify(b: &mut Bencher) { // use rustc_serialize::json::Json; // b.bytes = JSON_STR.len() as u64; // let json = Json::from_str(JSON_STR).unwrap(); // let mut decoder = rustc_serialize::json::Decoder::new(json); // let log: Log = rustc_serialize::Decodable::decode(&mut decoder).unwrap(); // b.iter(|| { // rustc_serialize::json::encode(&log).unwrap(); // }) // } // #[bench] // fn serde_json_parse(b: &mut Bencher) { // b.bytes = JSON_STR.len() as u64; // b.iter(|| { // serde_json::from_str::(JSON_STR).unwrap(); // }); // } // #[bench] // fn serde_json_stringify(b: &mut Bencher) { // let data = serde_json::from_str::(JSON_STR).unwrap(); // b.bytes = serde_json::to_string(&data).unwrap().len() as u64; // b.iter(|| { // serde_json::to_string(&data).unwrap(); // }) // } // #[bench] // fn serde_json_floats_parse(b: &mut Bencher) { // b.bytes = JSON_FLOAT_STR.len() as u64; // b.iter(|| { // serde_json::from_str::(JSON_FLOAT_STR).unwrap(); // }); // } // #[bench] // fn serde_json_floats_stringify(b: &mut Bencher) { // let data = serde_json::from_str::(JSON_FLOAT_STR).unwrap(); // b.bytes = serde_json::to_string(&data).unwrap().len() as u64; // b.iter(|| { // serde_json::to_string(&data).unwrap(); // }) // } // #[bench] // fn serde_json_struct_parse(b: &mut Bencher) { // b.bytes = JSON_STR.len() as u64; // b.iter(|| { // serde_json::from_str::(JSON_STR).unwrap(); // }); // } // #[bench] // fn serde_json_struct_stringify(b: &mut Bencher) { // b.bytes = JSON_STR.len() as u64; // let data = serde_json::from_str::(JSON_STR).unwrap(); // b.iter(|| { // serde_json::to_string(&data).unwrap(); // }); // } #[bench] fn json_rust_parse(b: &mut Bencher) { b.bytes = JSON_STR.len() as u64; b.iter(|| { json::parse(JSON_STR).unwrap(); }); } #[bench] fn json_rust_parse_floats(b: &mut Bencher) { b.bytes = JSON_FLOAT_STR.len() as u64; b.iter(|| { json::parse(JSON_FLOAT_STR).unwrap(); }); } #[bench] fn json_rust_stringify(b: &mut Bencher) { let data = json::parse(JSON_STR).unwrap(); b.bytes = data.dump().len() as u64; b.iter(|| { data.dump(); }) } #[bench] fn json_rust_stringify_io_write(b: &mut Bencher) { let data = json::parse(JSON_STR).unwrap(); b.bytes = data.dump().len() as u64; let mut target = Vec::new(); b.iter(|| { data.to_writer(&mut target); }) } #[bench] fn json_rust_stringify_floats(b: &mut Bencher) { let data = json::parse(JSON_FLOAT_STR).unwrap(); b.bytes = data.dump().len() as u64; b.iter(|| { data.dump(); }) } #[bench] fn json_rust_stringify_floats_io_write(b: &mut Bencher) { let data = json::parse(JSON_FLOAT_STR).unwrap(); b.bytes = data.dump().len() as u64; let mut target = Vec::new(); b.iter(|| { data.to_writer(&mut target); }) }