7 use serde
::{de::DeserializeOwned, Deserialize, Serialize}
;
11 ByteRecord
, Reader
, ReaderBuilder
, StringRecord
, Trim
, Writer
,
15 static NFL
: &'
static str = include_str
!("../examples/data/bench/nfl.csv");
16 static GAME
: &'
static str = include_str
!("../examples/data/bench/game.csv");
17 static POP
: &'
static str =
18 include_str
!("../examples/data/bench/worldcitiespop.csv");
19 static MBTA
: &'
static str =
20 include_str
!("../examples/data/bench/gtfs-mbta-stop-times.csv");
22 #[derive(Debug, Serialize, Deserialize, PartialEq)]
39 #[derive(Debug, Serialize, Deserialize, PartialEq)]
40 struct NFLRowBorrowed
<'a
> {
56 #[derive(Debug, Serialize, Deserialize, PartialEq)]
57 struct GAMERowOwned(String
, String
, String
, String
, i32, String
);
59 #[derive(Debug, Serialize, Deserialize, PartialEq)]
60 struct GAMERowBorrowed
<'a
>(&'a
str, &'a
str, &'a
str, &'a
str, i32, &'a
str);
62 #[derive(Debug, Serialize, Deserialize, PartialEq)]
63 #[serde(rename_all = "PascalCase")]
69 population
: Option
<i32>,
74 #[derive(Debug, Serialize, Deserialize, PartialEq)]
75 #[serde(rename_all = "PascalCase")]
76 struct POPRowBorrowed
<'a
> {
81 population
: Option
<i32>,
86 #[derive(Debug, Serialize, Deserialize, PartialEq)]
90 departure_time
: String
,
93 stop_headsign
: String
,
99 #[derive(Debug, Serialize, Deserialize, PartialEq)]
100 struct MBTARowBorrowed
<'a
> {
102 arrival_time
: &'a
str,
103 departure_time
: &'a
str,
106 stop_headsign
: &'a
str,
116 impl io
::Write
for ByteCounter
{
117 fn write(&mut self, data
: &[u8]) -> io
::Result
<usize> {
118 self.count
+= data
.len();
121 fn flush(&mut self) -> io
::Result
<()> {
127 ($name
:ident
, $data
:ident
, $counter
:ident
, $result
:expr
) => {
129 fn $
name(b
: &mut Bencher
) {
130 let data
= $data
.as_bytes();
131 b
.bytes
= data
.len() as u64;
134 ReaderBuilder
::new().has_headers(false).from_reader(data
);
135 assert_eq
!($
counter(&mut rdr
), $result
);
141 macro_rules
! bench_trimmed
{
142 ($name
:ident
, $data
:ident
, $counter
:ident
, $result
:expr
) => {
144 fn $
name(b
: &mut Bencher
) {
145 let data
= $data
.as_bytes();
146 b
.bytes
= data
.len() as u64;
148 let mut rdr
= ReaderBuilder
::new()
152 assert_eq
!($
counter(&mut rdr
), $result
);
158 macro_rules
! bench_serde
{
160 $name_de
:ident
, $name_ser
:ident
, $data
:ident
, $counter
:ident
, $
type:ty
, $result
:expr
) => {
162 fn $
name_de(b
: &mut Bencher
) {
163 let data
= $data
.as_bytes();
164 b
.bytes
= data
.len() as u64;
167 ReaderBuilder
::new().has_headers(false).from_reader(data
);
168 assert_eq
!($counter
::<_
, $
type>(&mut rdr
), $result
);
172 fn $
name_ser(b
: &mut Bencher
) {
173 let data
= $data
.as_bytes();
174 let values
= ReaderBuilder
::new()
178 .collect
::<Result
<Vec
<$
type>, _
>>()
182 let mut counter
= ByteCounter
::default();
184 let mut wtr
= WriterBuilder
::new()
186 .from_writer(&mut counter
);
188 wtr
.serialize(val
).unwrap();
193 b
.bytes
= do_it() as u64;
197 ($name_de
:ident
, $name_ser
:ident
, $data
:ident
, $counter
:ident
, $
type:ty
, $result
:expr
) => {
199 fn $
name_de(b
: &mut Bencher
) {
200 let data
= $data
.as_bytes();
201 b
.bytes
= data
.len() as u64;
204 ReaderBuilder
::new().has_headers(true).from_reader(data
);
205 assert_eq
!($counter
::<_
, $
type>(&mut rdr
), $result
);
209 fn $
name_ser(b
: &mut Bencher
) {
210 let data
= $data
.as_bytes();
211 let values
= ReaderBuilder
::new()
215 .collect
::<Result
<Vec
<$
type>, _
>>()
219 let mut counter
= ByteCounter
::default();
221 let mut wtr
= WriterBuilder
::new()
223 .from_writer(&mut counter
);
225 wtr
.serialize(val
).unwrap();
230 b
.bytes
= do_it() as u64;
236 macro_rules
! bench_serde_borrowed_bytes
{
237 ($name
:ident
, $data
:ident
, $
type:ty
, $headers
:expr
, $result
:expr
) => {
239 fn $
name(b
: &mut Bencher
) {
240 let data
= $data
.as_bytes();
241 b
.bytes
= data
.len() as u64;
243 let mut rdr
= ReaderBuilder
::new()
244 .has_headers($headers
)
247 let mut rec
= ByteRecord
::new();
248 while rdr
.read_byte_record(&mut rec
).unwrap() {
249 let _
: $
type = rec
.deserialize(None
).unwrap();
258 macro_rules
! bench_serde_borrowed_str
{
259 ($name
:ident
, $data
:ident
, $
type:ty
, $headers
:expr
, $result
:expr
) => {
261 fn $
name(b
: &mut Bencher
) {
262 let data
= $data
.as_bytes();
263 b
.bytes
= data
.len() as u64;
265 let mut rdr
= ReaderBuilder
::new()
266 .has_headers($headers
)
269 let mut rec
= StringRecord
::new();
270 while rdr
.read_record(&mut rec
).unwrap() {
271 let _
: $
type = rec
.deserialize(None
).unwrap();
281 count_nfl_deserialize_owned_bytes
,
282 count_nfl_serialize_owned_bytes
,
284 count_deserialize_owned_bytes
,
289 count_nfl_deserialize_owned_str
,
290 count_nfl_serialize_owned_str
,
292 count_deserialize_owned_str
,
296 bench_serde_borrowed_bytes
!(
297 count_nfl_deserialize_borrowed_bytes
,
303 bench_serde_borrowed_str
!(
304 count_nfl_deserialize_borrowed_str
,
310 bench
!(count_nfl_iter_bytes
, NFL
, count_iter_bytes
, 130000);
311 bench_trimmed
!(count_nfl_iter_bytes_trimmed
, NFL
, count_iter_bytes
, 130000);
312 bench
!(count_nfl_iter_str
, NFL
, count_iter_str
, 130000);
313 bench_trimmed
!(count_nfl_iter_str_trimmed
, NFL
, count_iter_str
, 130000);
314 bench
!(count_nfl_read_bytes
, NFL
, count_read_bytes
, 130000);
315 bench
!(count_nfl_read_str
, NFL
, count_read_str
, 130000);
318 count_game_deserialize_owned_bytes
,
319 count_game_serialize_owned_bytes
,
321 count_deserialize_owned_bytes
,
327 count_game_deserialize_owned_str
,
328 count_game_serialize_owned_str
,
330 count_deserialize_owned_str
,
334 bench_serde_borrowed_bytes
!(
335 count_game_deserialize_borrowed_bytes
,
341 bench_serde_borrowed_str
!(
342 count_game_deserialize_borrowed_str
,
348 bench
!(count_game_iter_bytes
, GAME
, count_iter_bytes
, 600000);
349 bench
!(count_game_iter_str
, GAME
, count_iter_str
, 600000);
350 bench
!(count_game_read_bytes
, GAME
, count_read_bytes
, 600000);
351 bench
!(count_game_read_str
, GAME
, count_read_str
, 600000);
353 count_pop_deserialize_owned_bytes
,
354 count_pop_serialize_owned_bytes
,
356 count_deserialize_owned_bytes
,
361 count_pop_deserialize_owned_str
,
362 count_pop_serialize_owned_str
,
364 count_deserialize_owned_str
,
368 bench_serde_borrowed_bytes
!(
369 count_pop_deserialize_borrowed_bytes
,
375 bench_serde_borrowed_str
!(
376 count_pop_deserialize_borrowed_str
,
382 bench
!(count_pop_iter_bytes
, POP
, count_iter_bytes
, 140007);
383 bench
!(count_pop_iter_str
, POP
, count_iter_str
, 140007);
384 bench
!(count_pop_read_bytes
, POP
, count_read_bytes
, 140007);
385 bench
!(count_pop_read_str
, POP
, count_read_str
, 140007);
387 count_mbta_deserialize_owned_bytes
,
388 count_mbta_serialize_owned_bytes
,
390 count_deserialize_owned_bytes
,
395 count_mbta_deserialize_owned_str
,
396 count_mbta_serialize_owned_str
,
398 count_deserialize_owned_str
,
402 bench_serde_borrowed_bytes
!(
403 count_mbta_deserialize_borrowed_bytes
,
409 bench_serde_borrowed_str
!(
410 count_mbta_deserialize_borrowed_str
,
416 bench
!(count_mbta_iter_bytes
, MBTA
, count_iter_bytes
, 90000);
417 bench
!(count_mbta_iter_str
, MBTA
, count_iter_str
, 90000);
418 bench
!(count_mbta_read_bytes
, MBTA
, count_read_bytes
, 90000);
419 bench
!(count_mbta_read_str
, MBTA
, count_read_str
, 90000);
421 macro_rules
! bench_write
{
422 ($name
:ident
, $data
:ident
) => {
424 fn $
name(b
: &mut Bencher
) {
425 let data
= $data
.as_bytes();
426 b
.bytes
= data
.len() as u64;
427 let records
= collect_records(data
);
430 let mut wtr
= Writer
::from_writer(vec
![]);
432 wtr
.write_record(r
).unwrap();
434 assert
!(wtr
.flush().is_ok());
440 macro_rules
! bench_write_bytes
{
441 ($name
:ident
, $data
:ident
) => {
443 fn $
name(b
: &mut Bencher
) {
444 let data
= $data
.as_bytes();
445 b
.bytes
= data
.len() as u64;
446 let records
= collect_records(data
);
449 let mut wtr
= Writer
::from_writer(vec
![]);
451 wtr
.write_byte_record(r
).unwrap();
453 assert
!(wtr
.flush().is_ok());
459 bench_write
!(write_nfl_record
, NFL
);
460 bench_write_bytes
!(write_nfl_bytes
, NFL
);
462 fn count_deserialize_owned_bytes
<R
, D
>(rdr
: &mut Reader
<R
>) -> u64
468 let mut rec
= ByteRecord
::new();
469 while rdr
.read_byte_record(&mut rec
).unwrap() {
470 let _
: D
= rec
.deserialize(None
).unwrap();
476 fn count_deserialize_owned_str
<R
, D
>(rdr
: &mut Reader
<R
>) -> u64
482 for rec
in rdr
.deserialize
::<D
>() {
483 let _
= rec
.unwrap();
489 fn count_iter_bytes
<R
: io
::Read
>(rdr
: &mut Reader
<R
>) -> u64 {
491 for rec
in rdr
.byte_records() {
492 count
+= rec
.unwrap().len() as u64;
497 fn count_iter_str
<R
: io
::Read
>(rdr
: &mut Reader
<R
>) -> u64 {
499 for rec
in rdr
.records() {
500 count
+= rec
.unwrap().len() as u64;
505 fn count_read_bytes
<R
: io
::Read
>(rdr
: &mut Reader
<R
>) -> u64 {
507 let mut rec
= ByteRecord
::new();
508 while rdr
.read_byte_record(&mut rec
).unwrap() {
509 count
+= rec
.len() as u64;
514 fn count_read_str
<R
: io
::Read
>(rdr
: &mut Reader
<R
>) -> u64 {
516 let mut rec
= StringRecord
::new();
517 while rdr
.read_record(&mut rec
).unwrap() {
518 count
+= rec
.len() as u64;
523 fn collect_records(data
: &[u8]) -> Vec
<ByteRecord
> {
524 let mut rdr
= ReaderBuilder
::new().has_headers(false).from_reader(data
);
525 rdr
.byte_records().collect
::<Result
<Vec
<_
>, _
>>().unwrap()