2014-09-06 20:41:13 -07:00
#![ feature(phase, macro_rules) ]
2014-06-20 19:32:30 -04:00
#![ allow(non_camel_case_types) ]
2014-09-06 20:41:13 -07:00
#[ phase(plugin) ]
extern crate serde_macros ;
extern crate serde ;
2014-06-20 19:32:30 -04:00
extern crate serialize ;
extern crate test ;
2014-07-05 23:44:43 -07:00
use std ::io ;
2014-12-01 12:21:18 -08:00
use std ::io ::ByRefWriter ;
2014-06-20 19:32:30 -04:00
use test ::Bencher ;
2014-09-06 20:41:13 -07:00
use serde ::de ;
2014-11-14 19:57:53 -08:00
use serde ::json ::ser ::escape_str ;
2014-09-06 20:41:13 -07:00
use serde ::json ;
2014-11-13 07:54:44 -08:00
use serde ::ser ::Serialize ;
2014-09-06 20:41:13 -07:00
use serde ::ser ;
2014-06-20 19:32:30 -04:00
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, Encodable, Decodable) ]
2014-11-13 07:54:44 -08:00
#[ deriving_serialize ]
#[ deriving_deserialize ]
2014-06-20 19:32:30 -04:00
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 ,
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, FromPrimitive) ]
2014-06-20 19:32:30 -04:00
enum HttpProtocol {
HTTP_PROTOCOL_UNKNOWN ,
HTTP10 ,
HTTP11 ,
}
2014-12-01 13:09:35 -08:00
impl < S : serialize ::Encoder < E > , E > serialize ::Encodable < S , E > for HttpProtocol {
fn encode ( & self , s : & mut S ) -> Result < ( ) , E > {
( * self as uint ) . encode ( s )
}
}
impl < D : ::serialize ::Decoder < E > , E > serialize ::Decodable < D , E > for HttpProtocol {
fn decode ( d : & mut D ) -> Result < HttpProtocol , E > {
match FromPrimitive ::from_uint ( try ! ( d . read_uint ( ) ) ) {
Some ( value ) = > Ok ( value ) ,
None = > Err ( d . error ( " cannot convert from uint " ) ) ,
}
}
}
2014-11-13 07:54:44 -08:00
impl < S : ser ::Serializer < E > , E > ser ::Serialize < S , E > for HttpProtocol {
2014-06-20 19:32:30 -04:00
#[ inline ]
2014-08-31 20:44:19 -07:00
fn serialize ( & self , s : & mut S ) -> Result < ( ) , E > {
2014-06-20 19:32:30 -04:00
s . serialize_uint ( * self as uint )
}
}
2014-11-13 07:54:44 -08:00
impl < D : de ::Deserializer < E > , E > de ::Deserialize < D , E > for HttpProtocol {
2014-08-02 16:06:05 -07:00
#[ inline ]
2014-08-19 15:18:47 -07:00
fn deserialize_token ( d : & mut D , token : de ::Token ) -> Result < HttpProtocol , E > {
2014-08-03 12:34:57 -07:00
d . expect_from_primitive ( token )
2014-08-02 16:06:05 -07:00
}
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, FromPrimitive) ]
2014-06-20 19:32:30 -04:00
enum HttpMethod {
METHOD_UNKNOWN ,
GET ,
POST ,
DELETE ,
PUT ,
HEAD ,
PURGE ,
OPTIONS ,
PROPFIND ,
MKCOL ,
PATCH ,
}
2014-12-01 13:09:35 -08:00
impl < S : serialize ::Encoder < E > , E > serialize ::Encodable < S , E > for HttpMethod {
fn encode ( & self , s : & mut S ) -> Result < ( ) , E > {
( * self as uint ) . encode ( s )
}
}
impl < D : ::serialize ::Decoder < E > , E > serialize ::Decodable < D , E > for HttpMethod {
fn decode ( d : & mut D ) -> Result < HttpMethod , E > {
match FromPrimitive ::from_uint ( try ! ( d . read_uint ( ) ) ) {
Some ( value ) = > Ok ( value ) ,
None = > Err ( d . error ( " cannot convert from uint " ) ) ,
}
}
}
2014-11-13 07:54:44 -08:00
impl < S : ser ::Serializer < E > , E > ser ::Serialize < S , E > for HttpMethod {
2014-06-20 19:32:30 -04:00
#[ inline ]
2014-08-31 20:44:19 -07:00
fn serialize ( & self , s : & mut S ) -> Result < ( ) , E > {
2014-06-20 19:32:30 -04:00
s . serialize_uint ( * self as uint )
}
}
2014-11-13 07:54:44 -08:00
impl < D : de ::Deserializer < E > , E > de ::Deserialize < D , E > for HttpMethod {
2014-08-02 16:06:05 -07:00
#[ inline ]
2014-08-19 15:18:47 -07:00
fn deserialize_token ( d : & mut D , token : de ::Token ) -> Result < HttpMethod , E > {
2014-08-03 12:34:57 -07:00
d . expect_from_primitive ( token )
2014-08-02 16:06:05 -07:00
}
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, FromPrimitive) ]
2014-06-20 19:32:30 -04:00
enum CacheStatus {
CACHESTATUS_UNKNOWN ,
Miss ,
Expired ,
Hit ,
}
2014-12-01 13:09:35 -08:00
impl < S : serialize ::Encoder < E > , E > serialize ::Encodable < S , E > for CacheStatus {
fn encode ( & self , s : & mut S ) -> Result < ( ) , E > {
( * self as uint ) . encode ( s )
}
}
impl < D : ::serialize ::Decoder < E > , E > serialize ::Decodable < D , E > for CacheStatus {
fn decode ( d : & mut D ) -> Result < CacheStatus , E > {
match FromPrimitive ::from_uint ( try ! ( d . read_uint ( ) ) ) {
Some ( value ) = > Ok ( value ) ,
None = > Err ( d . error ( " cannot convert from uint " ) ) ,
}
}
}
2014-11-13 07:54:44 -08:00
impl < S : ser ::Serializer < E > , E > ser ::Serialize < S , E > for CacheStatus {
2014-06-20 19:32:30 -04:00
#[ inline ]
2014-08-31 20:44:19 -07:00
fn serialize ( & self , s : & mut S ) -> Result < ( ) , E > {
2014-06-20 19:32:30 -04:00
s . serialize_uint ( * self as uint )
}
}
2014-11-13 07:54:44 -08:00
impl < D : de ::Deserializer < E > , E > de ::Deserialize < D , E > for CacheStatus {
2014-08-02 16:06:05 -07:00
#[ inline ]
2014-08-19 15:18:47 -07:00
fn deserialize_token ( d : & mut D , token : de ::Token ) -> Result < CacheStatus , E > {
2014-08-03 12:34:57 -07:00
d . expect_from_primitive ( token )
2014-08-02 16:06:05 -07:00
}
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, Encodable, Decodable) ]
2014-11-13 07:54:44 -08:00
#[ deriving_serialize ]
#[ deriving_deserialize ]
2014-06-20 19:32:30 -04:00
struct Origin {
ip : String ,
port : u32 ,
hostname : String ,
protocol : OriginProtocol ,
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, FromPrimitive) ]
2014-06-20 19:32:30 -04:00
enum OriginProtocol {
ORIGIN_PROTOCOL_UNKNOWN ,
HTTP ,
HTTPS ,
}
2014-12-01 13:09:35 -08:00
impl < S : serialize ::Encoder < E > , E > serialize ::Encodable < S , E > for OriginProtocol {
fn encode ( & self , s : & mut S ) -> Result < ( ) , E > {
( * self as uint ) . encode ( s )
}
}
impl < D : ::serialize ::Decoder < E > , E > serialize ::Decodable < D , E > for OriginProtocol {
fn decode ( d : & mut D ) -> Result < OriginProtocol , E > {
match FromPrimitive ::from_uint ( try ! ( d . read_uint ( ) ) ) {
Some ( value ) = > Ok ( value ) ,
None = > Err ( d . error ( " cannot convert from uint " ) ) ,
}
}
}
2014-11-13 07:54:44 -08:00
impl < S : ser ::Serializer < E > , E > ser ::Serialize < S , E > for OriginProtocol {
2014-06-20 19:32:30 -04:00
#[ inline ]
2014-08-31 20:44:19 -07:00
fn serialize ( & self , s : & mut S ) -> Result < ( ) , E > {
2014-06-20 19:32:30 -04:00
s . serialize_uint ( * self as uint )
}
}
2014-11-13 07:54:44 -08:00
impl < D : de ::Deserializer < E > , E > de ::Deserialize < D , E > for OriginProtocol {
2014-08-02 16:06:05 -07:00
#[ inline ]
2014-08-19 15:18:47 -07:00
fn deserialize_token ( d : & mut D , token : de ::Token ) -> Result < OriginProtocol , E > {
2014-08-03 12:34:57 -07:00
d . expect_from_primitive ( token )
2014-08-02 16:06:05 -07:00
}
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, FromPrimitive) ]
2014-06-20 19:32:30 -04:00
enum ZonePlan {
ZONEPLAN_UNKNOWN ,
FREE ,
PRO ,
BIZ ,
ENT ,
}
2014-12-01 13:09:35 -08:00
impl < S : serialize ::Encoder < E > , E > serialize ::Encodable < S , E > for ZonePlan {
fn encode ( & self , s : & mut S ) -> Result < ( ) , E > {
( * self as uint ) . encode ( s )
}
}
impl < D : ::serialize ::Decoder < E > , E > serialize ::Decodable < D , E > for ZonePlan {
fn decode ( d : & mut D ) -> Result < ZonePlan , E > {
match FromPrimitive ::from_uint ( try ! ( d . read_uint ( ) ) ) {
Some ( value ) = > Ok ( value ) ,
None = > Err ( d . error ( " cannot convert from uint " ) ) ,
}
}
}
2014-11-13 07:54:44 -08:00
impl < S : ser ::Serializer < E > , E > ser ::Serialize < S , E > for ZonePlan {
2014-06-20 19:32:30 -04:00
#[ inline ]
2014-08-31 20:44:19 -07:00
fn serialize ( & self , s : & mut S ) -> Result < ( ) , E > {
2014-06-20 19:32:30 -04:00
s . serialize_uint ( * self as uint )
}
}
2014-11-13 07:54:44 -08:00
impl < D : de ::Deserializer < E > , E > de ::Deserialize < D , E > for ZonePlan {
2014-08-02 16:06:05 -07:00
#[ inline ]
2014-08-19 15:18:47 -07:00
fn deserialize_token ( d : & mut D , token : de ::Token ) -> Result < ZonePlan , E > {
2014-08-03 12:34:57 -07:00
d . expect_from_primitive ( token )
2014-08-02 16:06:05 -07:00
}
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, FromPrimitive) ]
2014-06-20 19:32:30 -04:00
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 ,
}
2014-12-01 13:09:35 -08:00
impl < S : serialize ::Encoder < E > , E > serialize ::Encodable < S , E > for Country {
fn encode ( & self , s : & mut S ) -> Result < ( ) , E > {
( * self as uint ) . encode ( s )
}
}
impl < D : ::serialize ::Decoder < E > , E > serialize ::Decodable < D , E > for Country {
fn decode ( d : & mut D ) -> Result < Country , E > {
match FromPrimitive ::from_uint ( try ! ( d . read_uint ( ) ) ) {
Some ( value ) = > Ok ( value ) ,
None = > Err ( d . error ( " cannot convert from uint " ) ) ,
}
}
}
2014-11-13 07:54:44 -08:00
impl < S : ser ::Serializer < E > , E > ser ::Serialize < S , E > for Country {
2014-06-20 19:32:30 -04:00
#[ inline ]
2014-08-31 20:44:19 -07:00
fn serialize ( & self , s : & mut S ) -> Result < ( ) , E > {
2014-06-20 19:32:30 -04:00
s . serialize_uint ( * self as uint )
}
}
2014-11-13 07:54:44 -08:00
impl < D : de ::Deserializer < E > , E > de ::Deserialize < D , E > for Country {
2014-08-02 16:06:05 -07:00
#[ inline ]
2014-08-19 15:18:47 -07:00
fn deserialize_token ( d : & mut D , token : de ::Token ) -> Result < Country , E > {
2014-08-03 12:34:57 -07:00
d . expect_from_primitive ( token )
2014-08-02 16:06:05 -07:00
}
}
2014-12-01 13:09:35 -08:00
#[ deriving(Show, PartialEq, Encodable, Decodable) ]
2014-11-13 07:54:44 -08:00
#[ deriving_serialize ]
#[ deriving_deserialize ]
2014-06-20 19:32:30 -04:00
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 ,
}
2014-07-17 21:28:31 -07:00
impl Log {
fn new ( ) -> Log {
Log {
2014-09-07 01:02:19 -07:00
timestamp : 2837513946597 ,
2014-07-17 21:28:31 -07:00
zone_id : 123456 ,
2014-11-22 16:27:01 -08:00
zone_plan : ZonePlan ::FREE ,
2014-07-17 21:28:31 -07:00
http : Http {
2014-11-22 16:27:01 -08:00
protocol : HttpProtocol ::HTTP11 ,
2014-07-17 21:28:31 -07:00
status : 200 ,
host_status : 503 ,
up_status : 520 ,
2014-11-22 16:27:01 -08:00
method : HttpMethod ::GET ,
2014-07-17 21:28:31 -07:00
content_type : " text/html " . to_string ( ) ,
user_agent : " Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36 " . to_string ( ) ,
referer : " https://www.cloudflare.com/ " . to_string ( ) ,
request_uri : " /cdn-cgi/trace " . to_string ( ) ,
} ,
origin : Origin {
ip : " 1.2.3.4 " . to_string ( ) ,
port : 8000 ,
hostname : " www.example.com " . to_string ( ) ,
2014-11-22 16:27:01 -08:00
protocol : OriginProtocol ::HTTPS ,
2014-07-17 21:28:31 -07:00
} ,
2014-11-22 16:27:01 -08:00
country : Country ::US ,
cache_status : CacheStatus ::Hit ,
2014-07-17 21:28:31 -07:00
server_ip : " 192.168.1.1 " . to_string ( ) ,
server_name : " metal.cloudflare.com " . to_string ( ) ,
remote_ip : " 10.1.2.3 " . to_string ( ) ,
bytes_dlv : 123456 ,
ray_id : " 10c73629cce30078-LAX " . to_string ( ) ,
}
}
}
2014-07-09 11:58:18 -07:00
macro_rules ! likely (
( $val :expr ) = > {
{
extern {
#[ link_name = " llvm.expect.i8 " ]
fn expect ( val : u8 , expected_val : u8 ) -> u8 ;
}
let x : bool = $val ;
unsafe { expect ( x as u8 , 1 ) ! = 0 }
}
}
)
macro_rules ! unlikely (
( $val :expr ) = > {
{
extern {
#[ link_name = " llvm.expect.i8 " ]
fn expect ( val : u8 , expected_val : u8 ) -> u8 ;
}
let x : bool = $val ;
unsafe { expect ( x as u8 , 0 ) ! = 0 }
}
}
)
struct MyMemWriter0 {
2014-07-05 23:44:43 -07:00
buf : Vec < u8 > ,
}
2014-07-09 11:58:18 -07:00
impl MyMemWriter0 {
pub fn with_capacity ( cap : uint ) -> MyMemWriter0 {
MyMemWriter0 {
2014-07-05 23:44:43 -07:00
buf : Vec ::with_capacity ( cap )
}
}
2014-12-01 13:20:37 -08:00
#[ inline ]
pub fn clear ( & mut self ) { self . buf . clear ( ) }
2014-07-05 23:44:43 -07:00
#[ inline ]
pub fn unwrap ( self ) -> Vec < u8 > { self . buf }
}
2014-07-09 11:58:18 -07:00
impl Writer for MyMemWriter0 {
2014-07-05 23:44:43 -07:00
#[ inline ]
fn write ( & mut self , buf : & [ u8 ] ) -> io ::IoResult < ( ) > {
2014-07-09 11:58:18 -07:00
self . buf . push_all ( buf ) ;
Ok ( ( ) )
}
}
struct MyMemWriter1 {
buf : Vec < u8 > ,
}
impl MyMemWriter1 {
pub fn with_capacity ( cap : uint ) -> MyMemWriter1 {
MyMemWriter1 {
buf : Vec ::with_capacity ( cap )
}
}
2014-07-05 23:44:43 -07:00
2014-12-01 13:20:37 -08:00
#[ inline ]
pub fn clear ( & mut self ) { self . buf . clear ( ) }
2014-07-09 11:58:18 -07:00
#[ inline ]
pub fn unwrap ( self ) -> Vec < u8 > { self . buf }
}
2014-07-17 21:28:31 -07:00
// LLVM isn't yet able to lower `Vec::push_all` into a memcpy, so this helps
2014-09-07 01:19:36 -07:00
// MemWriter eke out that last bit of performance.
2014-12-01 13:32:00 -08:00
#[ inline ]
2014-07-17 21:28:31 -07:00
fn push_all_bytes ( dst : & mut Vec < u8 > , src : & [ u8 ] ) {
let dst_len = dst . len ( ) ;
let src_len = src . len ( ) ;
2014-11-07 18:28:31 -02:00
dst . reserve ( src_len ) ;
2014-07-17 21:28:31 -07:00
unsafe {
2014-11-07 18:28:31 -02:00
// we would have failed if `reserve` overflowed.
2014-07-17 21:28:31 -07:00
dst . set_len ( dst_len + src_len ) ;
::std ::ptr ::copy_nonoverlapping_memory (
dst . as_mut_ptr ( ) . offset ( dst_len as int ) ,
src . as_ptr ( ) ,
src_len ) ;
}
}
2014-07-09 11:58:18 -07:00
impl Writer for MyMemWriter1 {
#[ inline ]
fn write ( & mut self , buf : & [ u8 ] ) -> io ::IoResult < ( ) > {
2014-07-17 21:28:31 -07:00
push_all_bytes ( & mut self . buf , buf ) ;
2014-07-05 23:44:43 -07:00
Ok ( ( ) )
}
}
2014-12-01 13:09:35 -08:00
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"}"# ;
#[ test ]
fn test_encoder ( ) {
2014-12-01 13:20:37 -08:00
use serialize ::Encodable ;
2014-12-01 13:09:35 -08:00
let log = Log ::new ( ) ;
2014-12-01 13:20:37 -08:00
let mut wr = Vec ::with_capacity ( 1024 ) ;
{
let mut encoder = serialize ::json ::Encoder ::new ( & mut wr as & mut io ::Writer ) ;
log . encode ( & mut encoder ) . unwrap ( ) ;
}
assert_eq! ( wr . as_slice ( ) , JSON_STR . as_bytes ( ) ) ;
2014-12-01 13:09:35 -08:00
}
2014-06-20 19:32:30 -04:00
#[ bench ]
fn bench_encoder ( b : & mut Bencher ) {
let log = Log ::new ( ) ;
2014-07-02 21:06:28 -07:00
let json = serialize ::json ::encode ( & log ) ;
2014-07-05 23:44:43 -07:00
b . bytes = json . len ( ) as u64 ;
2014-06-20 19:32:30 -04:00
b . iter ( | | {
2014-07-02 21:06:28 -07:00
let _ = serialize ::json ::encode ( & log ) ;
2014-06-20 19:32:30 -04:00
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_serializer ( ) {
let log = Log ::new ( ) ;
let json = json ::to_vec ( & log ) ;
assert_eq! ( json . as_slice ( ) , JSON_STR . as_bytes ( ) ) ;
}
2014-06-20 19:32:30 -04:00
#[ bench ]
fn bench_serializer ( b : & mut Bencher ) {
let log = Log ::new ( ) ;
2014-07-05 23:44:43 -07:00
let json = json ::to_vec ( & log ) ;
b . bytes = json . len ( ) as u64 ;
b . iter ( | | {
let _json = json ::to_vec ( & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_serializer_vec ( ) {
let log = Log ::new ( ) ;
let wr = Vec ::with_capacity ( 1024 ) ;
let mut serializer = json ::Serializer ::new ( wr ) ;
log . serialize ( & mut serializer ) . unwrap ( ) ;
let json = serializer . unwrap ( ) ;
assert_eq! ( json . as_slice ( ) , JSON_STR . as_bytes ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
2014-12-01 13:09:35 -08:00
fn bench_serializer_vec ( b : & mut Bencher ) {
2014-07-17 21:28:31 -07:00
let log = Log ::new ( ) ;
let json = json ::to_vec ( & log ) ;
b . bytes = json . len ( ) as u64 ;
2014-12-01 13:20:37 -08:00
let mut wr = Vec ::with_capacity ( 1024 ) ;
2014-07-17 21:28:31 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
let mut serializer = json ::Serializer ::new ( wr . by_ref ( ) ) ;
2014-08-31 20:44:19 -07:00
log . serialize ( & mut serializer ) . unwrap ( ) ;
2014-12-01 12:21:18 -08:00
let _json = serializer . unwrap ( ) ;
2014-07-17 21:28:31 -07:00
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_serializer_my_mem_writer0 ( ) {
let log = Log ::new ( ) ;
2014-12-01 13:20:37 -08:00
let mut wr = MyMemWriter0 ::with_capacity ( 1024 ) ;
2014-12-01 13:09:35 -08:00
2014-12-01 13:20:37 -08:00
{
let mut serializer = json ::Serializer ::new ( wr . by_ref ( ) ) ;
log . serialize ( & mut serializer ) . unwrap ( ) ;
}
assert_eq! ( wr . unwrap ( ) . as_slice ( ) , JSON_STR . as_bytes ( ) ) ;
2014-12-01 13:09:35 -08:00
}
2014-07-17 21:28:31 -07:00
#[ bench ]
fn bench_serializer_my_mem_writer0 ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
let json = json ::to_vec ( & log ) ;
b . bytes = json . len ( ) as u64 ;
2014-06-20 19:32:30 -04:00
2014-12-01 13:20:37 -08:00
let mut wr = MyMemWriter0 ::with_capacity ( 1024 ) ;
2014-06-20 19:32:30 -04:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
let mut serializer = json ::Serializer ::new ( wr . by_ref ( ) ) ;
2014-08-31 20:44:19 -07:00
log . serialize ( & mut serializer ) . unwrap ( ) ;
2014-06-20 19:32:30 -04:00
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_serializer_my_mem_writer1 ( ) {
let log = Log ::new ( ) ;
2014-12-01 13:20:37 -08:00
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
2014-12-01 13:09:35 -08:00
2014-12-01 13:20:37 -08:00
{
let mut serializer = json ::Serializer ::new ( wr . by_ref ( ) ) ;
log . serialize ( & mut serializer ) . unwrap ( ) ;
}
assert_eq! ( wr . unwrap ( ) . as_slice ( ) , JSON_STR . as_bytes ( ) ) ;
2014-12-01 13:09:35 -08:00
}
2014-07-17 21:28:31 -07:00
#[ bench ]
fn bench_serializer_my_mem_writer1 ( b : & mut Bencher ) {
let log = Log ::new ( ) ;
let json = json ::to_vec ( & log ) ;
b . bytes = json . len ( ) as u64 ;
2014-12-01 13:20:37 -08:00
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
2014-07-17 21:28:31 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
let mut serializer = json ::Serializer ::new ( wr . by_ref ( ) ) ;
2014-08-31 20:44:19 -07:00
log . serialize ( & mut serializer ) . unwrap ( ) ;
2014-07-17 21:28:31 -07:00
} ) ;
}
2014-07-03 07:07:30 -07:00
#[ bench ]
fn bench_copy ( b : & mut Bencher ) {
2014-12-01 13:09:35 -08:00
let json = JSON_STR . as_bytes ( ) . to_vec ( ) ;
2014-07-05 23:44:43 -07:00
b . bytes = json . len ( ) as u64 ;
b . iter ( | | {
2014-12-01 13:09:35 -08:00
let _json = JSON_STR . as_bytes ( ) . to_vec ( ) ;
2014-07-05 23:44:43 -07:00
} ) ;
}
fn manual_no_escape < W : Writer > ( mut wr : W , log : & Log ) {
wr . write_str ( " { \" timestamp \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . timestamp ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" zone_id \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . zone_id ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" zone_plan \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . zone_plan as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" http \" :{ \" protocol \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . protocol as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" status \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . status ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" host_status \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . host_status ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" up_status \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . up_status ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" method \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . method as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" content_type \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . http . content_type ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" user_agent \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . http . user_agent ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" referer \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . http . referer ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" request_uri \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . http . request_uri ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " }, \" origin \" :{ " ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
2014-09-07 01:04:39 -07:00
wr . write_str ( " \" ip \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . origin . ip ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , \" port \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . origin . port ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" hostname \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . origin . hostname ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" protocol \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . origin . protocol as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " }, \" country \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . country as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" cache_status \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . cache_status as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" server_ip \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . server_ip ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" server_name \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . server_name ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" remote_ip \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . remote_ip ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" bytes_dlv \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . bytes_dlv ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " , \" ray_id \" : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " \" {} \" " , log . ray_id ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " } " ) . unwrap ( ) ;
}
fn manual_escape < W : Writer > ( mut wr : W , log : & Log ) {
2014-09-07 01:04:39 -07:00
wr . write_str ( " { " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " timestamp " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . timestamp ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " zone_id " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . zone_id ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " zone_plan " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . zone_plan as int ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " http " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " :{ " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " protocol " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . protocol as uint ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " status " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . status ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " host_status " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . host_status ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " up_status " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . up_status ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " method " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . http . method as uint ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " content_type " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . http . content_type . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " user_agent " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . http . user_agent . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " referer " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . http . referer . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " request_uri " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . http . request_uri . as_slice ( ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
2014-09-07 01:04:39 -07:00
wr . write_str ( " }, " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " origin " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " :{ " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " ip " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . origin . ip . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " port " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . origin . port ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " hostname " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . origin . hostname . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " protocol " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . origin . protocol as uint ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
2014-09-07 01:04:39 -07:00
wr . write_str ( " }, " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " country " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . country as uint ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " cache_status " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . cache_status as uint ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " server_ip " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . server_ip . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " server_name " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . server_name . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " remote_ip " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . remote_ip . as_slice ( ) ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " bytes_dlv " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-22 16:27:01 -08:00
( write! ( & mut wr , " {} " , log . bytes_dlv ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
2014-09-07 01:04:39 -07:00
wr . write_str ( " , " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , " ray_id " ) . unwrap ( ) ;
2014-09-07 01:04:39 -07:00
wr . write_str ( " : " ) . unwrap ( ) ;
2014-11-14 19:57:53 -08:00
escape_str ( & mut wr , log . ray_id . as_slice ( ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
wr . write_str ( " } " ) . unwrap ( ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
2014-12-01 13:32:00 -08:00
fn test_manual_vec_no_escape ( ) {
2014-12-01 13:09:35 -08:00
let log = Log ::new ( ) ;
let mut wr = Vec ::with_capacity ( 1024 ) ;
manual_no_escape ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
2014-12-01 13:32:00 -08:00
fn bench_manual_vec_no_escape ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
2014-12-01 12:21:18 -08:00
let mut wr = Vec ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
manual_no_escape ( wr . by_ref ( ) , & log ) ;
2014-12-01 12:21:18 -08:00
b . bytes = wr . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
2014-07-05 23:44:43 -07:00
manual_no_escape ( wr . by_ref ( ) , & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
2014-12-01 13:32:00 -08:00
fn test_manual_vec_escape ( ) {
2014-12-01 13:09:35 -08:00
let log = Log ::new ( ) ;
let mut wr = Vec ::with_capacity ( 1024 ) ;
manual_escape ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
2014-12-01 13:32:00 -08:00
fn bench_manual_vec_escape ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
2014-12-01 12:21:18 -08:00
let mut wr = Vec ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
manual_escape ( wr . by_ref ( ) , & log ) ;
2014-12-01 12:21:18 -08:00
b . bytes = wr . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
2014-07-05 23:44:43 -07:00
manual_escape ( wr . by_ref ( ) , & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_manual_my_mem_writer0_no_escape ( ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter0 ::with_capacity ( 1000 ) ;
manual_no_escape ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr . unwrap ( ) ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
2014-07-09 11:58:18 -07:00
fn bench_manual_my_mem_writer0_no_escape ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
2014-07-09 11:58:18 -07:00
let mut wr = MyMemWriter0 ::with_capacity ( 1000 ) ;
2014-07-05 23:44:43 -07:00
manual_no_escape ( wr . by_ref ( ) , & log ) ;
2014-12-01 13:20:37 -08:00
b . bytes = wr . buf . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
2014-07-05 23:44:43 -07:00
manual_no_escape ( wr . by_ref ( ) , & log ) ;
2014-12-01 13:09:35 -08:00
} ) ;
}
2014-07-05 23:44:43 -07:00
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_manual_my_mem_writer0_escape ( ) {
let log = Log ::new ( ) ;
2014-07-05 23:44:43 -07:00
2014-12-01 13:09:35 -08:00
let mut wr = MyMemWriter0 ::with_capacity ( 1024 ) ;
manual_escape ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr . unwrap ( ) ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
2014-07-05 23:44:43 -07:00
}
#[ bench ]
2014-07-09 11:58:18 -07:00
fn bench_manual_my_mem_writer0_escape ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
2014-12-01 13:09:35 -08:00
let mut wr = MyMemWriter0 ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
manual_escape ( wr . by_ref ( ) , & log ) ;
2014-12-01 13:20:37 -08:00
b . bytes = wr . buf . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
2014-07-03 07:07:30 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
2014-07-09 11:58:18 -07:00
manual_escape ( wr . by_ref ( ) , & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_manual_my_mem_writer1_no_escape ( ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
manual_no_escape ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr . unwrap ( ) ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-09 11:58:18 -07:00
#[ bench ]
fn bench_manual_my_mem_writer1_no_escape ( b : & mut Bencher ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter1 ::with_capacity ( 1000 ) ;
manual_no_escape ( wr . by_ref ( ) , & log ) ;
2014-12-01 13:20:37 -08:00
b . bytes = wr . buf . len ( ) as u64 ;
2014-07-09 11:58:18 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
2014-07-09 11:58:18 -07:00
manual_no_escape ( wr . by_ref ( ) , & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_manual_my_mem_writer1_escape ( ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
manual_escape ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr . unwrap ( ) ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-09 11:58:18 -07:00
#[ bench ]
fn bench_manual_my_mem_writer1_escape ( b : & mut Bencher ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
manual_escape ( wr . by_ref ( ) , & log ) ;
b . bytes = wr . unwrap ( ) . len ( ) as u64 ;
b . iter ( | | {
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
manual_escape ( wr . by_ref ( ) , & log ) ;
let _json = wr . unwrap ( ) ;
2014-07-03 07:07:30 -07:00
} ) ;
}
2014-08-31 20:44:19 -07:00
fn direct < W : Writer > ( wr : W , log : & Log ) {
2014-09-06 20:41:13 -07:00
use serde ::ser ::Serializer ;
2014-07-05 23:44:43 -07:00
2014-08-31 20:44:19 -07:00
let mut serializer = json ::Serializer ::new ( wr ) ;
2014-12-01 13:09:35 -08:00
2014-07-05 23:44:43 -07:00
serializer . serialize_struct_start ( " Log " , 12 ) . unwrap ( ) ;
2014-07-31 07:18:26 -07:00
serializer . serialize_struct_elt ( " timestamp " , & log . timestamp ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " zone_id " , & log . zone_id ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " zone_plan " , & ( log . zone_plan as uint ) ) . unwrap ( ) ;
2014-12-01 13:09:35 -08:00
serializer . serialize_struct_elt ( " http " , & log . http ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " origin " , & log . origin ) . unwrap ( ) ;
2014-07-31 07:18:26 -07:00
serializer . serialize_struct_elt ( " country " , & ( log . country as uint ) ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " cache_status " , & ( log . cache_status as uint ) ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " server_ip " , & log . server_ip . as_slice ( ) ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " server_name " , & log . server_name . as_slice ( ) ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " remote_ip " , & log . remote_ip . as_slice ( ) ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " bytes_dlv " , & log . bytes_dlv ) . unwrap ( ) ;
serializer . serialize_struct_elt ( " ray_id " , & log . ray_id . as_slice ( ) ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
serializer . serialize_struct_end ( ) . unwrap ( ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_direct_vec ( ) {
let log = Log ::new ( ) ;
let mut wr = Vec ::with_capacity ( 1024 ) ;
direct ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
2014-12-01 13:09:35 -08:00
fn bench_direct_vec ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
2014-12-01 12:21:18 -08:00
let mut wr = Vec ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
direct ( wr . by_ref ( ) , & log ) ;
2014-12-01 12:21:18 -08:00
b . bytes = wr . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
b . iter ( | | {
2014-12-01 12:21:18 -08:00
let mut wr = Vec ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
direct ( wr . by_ref ( ) , & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_direct_my_mem_writer0 ( ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter0 ::with_capacity ( 1024 ) ;
direct ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr . unwrap ( ) ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
2014-07-09 11:58:18 -07:00
fn bench_direct_my_mem_writer0 ( b : & mut Bencher ) {
2014-07-05 23:44:43 -07:00
let log = Log ::new ( ) ;
2014-07-09 11:58:18 -07:00
let mut wr = MyMemWriter0 ::with_capacity ( 1024 ) ;
2014-07-05 23:44:43 -07:00
direct ( wr . by_ref ( ) , & log ) ;
2014-12-01 13:20:37 -08:00
b . bytes = wr . buf . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
b . iter ( | | {
2014-12-01 13:20:37 -08:00
wr . clear ( ) ;
2014-07-05 23:44:43 -07:00
direct ( wr . by_ref ( ) , & log ) ;
2014-07-03 07:07:30 -07:00
} ) ;
}
2014-12-01 13:32:00 -08:00
#[ test ]
fn test_direct_my_mem_writer1 ( ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
direct ( wr . by_ref ( ) , & log ) ;
let json = String ::from_utf8 ( wr . unwrap ( ) ) . unwrap ( ) ;
assert_eq! ( JSON_STR , json . as_slice ( ) ) ;
}
#[ bench ]
fn bench_direct_my_mem_writer1 ( b : & mut Bencher ) {
let log = Log ::new ( ) ;
let mut wr = MyMemWriter1 ::with_capacity ( 1024 ) ;
direct ( wr . by_ref ( ) , & log ) ;
b . bytes = wr . buf . len ( ) as u64 ;
b . iter ( | | {
wr . clear ( ) ;
direct ( wr . by_ref ( ) , & log ) ;
} ) ;
}
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_decoder ( ) {
let json = serialize ::json ::from_str ( JSON_STR ) . unwrap ( ) ;
let mut decoder = serialize ::json ::Decoder ::new ( json ) ;
let log : Log = serialize ::Decodable ::decode ( & mut decoder ) . unwrap ( ) ;
assert_eq! ( log , Log ::new ( ) ) ;
}
2014-06-20 19:32:30 -04:00
#[ bench ]
2014-06-22 10:33:45 -04:00
fn bench_decoder ( b : & mut Bencher ) {
2014-12-01 13:09:35 -08:00
b . bytes = JSON_STR . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
2014-06-20 19:32:30 -04:00
b . iter ( | | {
2014-12-01 13:09:35 -08:00
let json = serialize ::json ::from_str ( JSON_STR ) . unwrap ( ) ;
2014-06-20 19:32:30 -04:00
let mut decoder = serialize ::json ::Decoder ::new ( json ) ;
let _log : Log = serialize ::Decodable ::decode ( & mut decoder ) . unwrap ( ) ;
} ) ;
}
2014-07-05 23:44:43 -07:00
2014-12-01 13:09:35 -08:00
#[ test ]
fn test_deserializer ( ) {
let log : Log = json ::from_str ( JSON_STR ) . unwrap ( ) ;
assert_eq! ( log , Log ::new ( ) ) ;
}
2014-07-05 23:44:43 -07:00
#[ bench ]
fn bench_deserializer ( b : & mut Bencher ) {
2014-12-01 13:09:35 -08:00
b . bytes = JSON_STR . len ( ) as u64 ;
2014-07-05 23:44:43 -07:00
b . iter ( | | {
2014-12-01 13:09:35 -08:00
let _log : Log = json ::from_str ( JSON_STR ) . unwrap ( ) ;
2014-07-05 23:44:43 -07:00
} ) ;
}
2014-10-22 19:22:49 -07:00
#[ bench ]
fn bench_deserializers ( b : & mut Bencher ) {
let s = r # "{"timestamp":25469139677502,"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"}"# ;
b . bytes = s . len ( ) as u64 ;
//b.iter(|| {
for _ in range ( 0 i , 10000 ) {
let _log : Log = json ::from_str ( s ) . unwrap ( ) ;
}
//});
}