NAME
Bencher::Scenario::Serializers - Benchmark Perl data serialization modules
VERSION
This document describes version 0.15 of Bencher::Scenario::Serializers (from Perl distribution Bencher-Scenario-Serializers), released on 2017-05-17.
SYNOPSIS
To run benchmark with default option:
% bencher -m Serializers
To run module startup overhead benchmark:
% bencher --module-startup -m Serializers
For more options (dump scenario, list/include/exclude/add participants, list/include/exclude/add datasets, etc), see bencher or run bencher --help
.
DESCRIPTION
Packaging a benchmark script as a Bencher scenario makes it convenient to include/exclude/add participants/datasets (either via CLI or Perl code), send the result to a central repository, among others . See Bencher and bencher (CLI) for more details.
BENCHMARKED MODULES
Version numbers shown below are the versions used when running the sample benchmark.
JSON::PP 2.27300
JSON::Tiny 0.56
JSON::XS 3.02
Cpanel::JSON::XS 3.0213
JSON::MaybeXS 1.003005
JSON::Decode::Regexp 0.09
JSON::Decode::Marpa 0.02
Pegex::JSON 0.27
JSON::Create 0.22
JSON::Parse 0.42
MarpaX::ESLIF::ECMA404 0.003
YAML::Old 1.07
YAML::Syck 1.29
YAML::XS 0.63
Storable 2.56
Sereal 3.015
Data::MessagePack 1.00
BENCHMARK PARTICIPANTS
JSON::PP::encode_json (perl_code) [json, serialize]
Code template:
state $json = JSON::PP->new->allow_nonref; $json->encode(<data>)
JSON::PP::decode_json (perl_code) [json, deserialize]
Code template:
state $json = JSON::PP->new->allow_nonref; $json->decode(<data>)
JSON::Tiny::encode_json (perl_code) [json, serialize]
Code template:
JSON::Tiny::encode_json(<data>)
JSON::Tiny::decode_json (perl_code) [json, deserialize]
Code template:
JSON::Tiny::decode_json(<data>)
JSON::XS::encode_json (perl_code) [json, serialize]
Code template:
state $json = JSON::XS->new->allow_nonref; $json->encode(<data>)
JSON::XS::decode_json (perl_code) [json, deserialize]
Code template:
state $json = JSON::XS->new->allow_nonref; $json->decode(<data>)
Cpanel::JSON::XS::encode_json (perl_code) [json, serialize]
Code template:
state $json = Cpanel::JSON::XS->new->allow_nonref; $json->encode(<data>)
Cpanel::JSON::XS::decode_json (perl_code) [json, deserialize]
Code template:
state $json = Cpanel::JSON::XS->new->allow_nonref; $json->decode(<data>)
JSON::MaybeXS::encode_json (perl_code) [json, serialize]
Code template:
state $json = JSON::MaybeXS->new(allow_nonref=>1); $json->encode(<data>)
JSON::MaybeXS::decode_json (perl_code) [json, deserialize]
Code template:
state $json = JSON::MaybeXS->new(allow_nonref=>1); $json->decode(<data>)
JSON::Decode::Regexp::from_json (perl_code) [json, deserialize]
Function call template:
JSON::Decode::Regexp::from_json(<data>)
PERLANCAR::JSON::Match::match_json (perl_code) (not included by default) [json, deserialize, cant_handle_scalar]
Function call template:
JSON::Decode::Marpa::from_json(<data>)
JSON::Decode::Marpa::from_json (perl_code) [json, deserialize]
Code template:
state $obj = Pegex::JSON->new; $obj->load(<data>);
Pegex::JSON (perl_code) [json, serialize]
Function call template:
JSON::Create::create_json(<data>)
JSON::Create::create_json (perl_code) [json, deserialize]
Function call template:
JSON::Parse::parse_json(<data>)
JSON::Parse::parse_json (perl_code) [json, deserialize]
Code template:
state $ecma404 = MarpaX::ESLIF::ECMA404->new; $ecma404->decode(<data>)
MarpaX::ESLIF::ECMA404::decode (perl_code) [yaml, serialize]
Function call template:
YAML::Old::Dump(<data>)
YAML::Old::Dump (perl_code) [yaml, deserialize]
Function call template:
YAML::Old::Load(<data>)
YAML::Old::Load (perl_code) [yaml, serialize]
Function call template:
YAML::Syck::Dump(<data>)
YAML::Syck::Dump (perl_code) [yaml, deserialize]
Function call template:
YAML::Syck::Load(<data>)
YAML::Syck::Load (perl_code) [yaml, serialize]
Function call template:
YAML::XS::Dump(<data>)
YAML::XS::Dump (perl_code) [yaml, deserialize]
Function call template:
YAML::XS::Load(<data>)
YAML::XS::Load (perl_code) [binary, serialize, cant_handle_scalar]
Function call template:
Storable::freeze(<data>)
Storable::freeze (perl_code) [binary, deserialize, cant_handle_scalar]
Function call template:
Storable::thaw(<data>)
Storable::thaw (perl_code) [binary, serialize]
Function call template:
Sereal::encode_sereal(<data>)
Sereal::encode_sereal (perl_code) [binary, deserialize]
Function call template:
Sereal::decode_sereal(<data>)
Sereal::decode_sereal (perl_code) [binary, serialize]
Code template:
state $obj = Data::MessagePack->new; $obj->pack(<data>)
Data::MessagePack::pack (perl_code) [binary, deserialize]
Code template:
state $obj = Data::MessagePack->new; $obj->unpack(<data>)
Data::MessagePack::unpack (perl_code)
Data::MessagePack::unpack
BENCHMARK DATASETS
undef [serialize]
undef
num [serialize]
A single number (-1.23)
str1k [serialize]
A non-Unicode string 1024 characters/bytes long
str1k [serialize, unicode]
A Unicode string 1024 characters (3072-bytes) long
array_int_10 [serialize]
A 10-element array containing ints
array_int_100 [serialize]
A 100-element array containing ints
array_int_1000 [serialize]
A 1000-element array containing ints
array_str1k_10 [serialize]
A 10-element array containing 1024-characters/bytes-long non-Unicode strings
array_ustr1k_10 [serialize, json]
A 10-element array containing 1024-characters-long (3072-bytes long) Unicode strings
hash_int_10 [serialize]
A 10-key hash {1=>0, ..., 10=>0}
hash_int_100 [serialize]
A 100-key hash {1=>0, ..., 100=>0}
hash_int_1000 [serialize]
A 1000-key hash {1=>0, ..., 1000=>0}
json:null [deserialize]
null
json:num [deserialize]
A single number (-1.23)
json:str1k [deserialize]
A non-Unicode (ASCII) string 1024-characters/bytes long
json:array_int_10 [deserialize]
A 10-element array containing ints
json:array_int_100 [deserialize]
A 10-element array containing ints
json:array_int_1000 [deserialize]
A 1000-element array containing ints
json:array_str1k_10 [deserialize]
A 10-element array containing 1024-characters/bytes-long non-Unicode strings
json:hash_int_10 [deserialize]
A 10-key hash {"1":0, ..., "10":0}
json:hash_int_100 [deserialize]
A 100-key hash {"1":0, ..., "100":0}
json:hash_int_1000 [deserialize]
A 1000-key hash {"1":0, ..., "1000":0}
SAMPLE BENCHMARK RESULTS
Run on: perl: v5.24.0, CPU: Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz (4 cores), OS: GNU/Linux Debian version 8.0, OS kernel: Linux version 3.16.0-4-amd64.
Benchmark serializing (bencher -m Serializers --include-participant-tags serialize
):
#table1#
{dataset=>"array_int_10"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 2910 | 344 | 1 | 2.1e-07 | 20 |
| JSON::PP::encode_json | json, serialize | 47800 | 20.9 | 16.4 | 6.5e-09 | 21 |
| JSON::Tiny::encode_json | json, serialize | 61000 | 16.4 | 21 | 6.7e-09 | 20 |
| YAML::Syck::Dump | yaml, serialize | 89000 | 11 | 30 | 1.3e-08 | 20 |
| YAML::XS::Dump | yaml, serialize | 110000 | 8.9 | 38 | 1.3e-08 | 20 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 240000 | 4.1 | 83 | 8.3e-09 | 20 |
| Sereal::encode_sereal | binary, serialize | 1240000 | 0.809 | 425 | 4e-10 | 26 |
| JSON::MaybeXS::encode_json | json, serialize | 1200000 | 0.81 | 430 | 1.7e-09 | 20 |
| Cpanel::JSON::XS::encode_json | json, serialize | 1290000 | 0.776 | 443 | 4.5e-10 | 20 |
| JSON::XS::encode_json | json, serialize | 1383000 | 0.723 | 475.4 | 1.1e-11 | 27 |
| Data::MessagePack::pack | binary, serialize | 1600000 | 0.63 | 540 | 8.1e-10 | 21 |
| JSON::Create::create_json | json, serialize | 1640000 | 0.611 | 562 | 2e-10 | 22 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table2#
{dataset=>"array_int_100"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 360 | 2.78 | 1 | 2.7e-06 | 20 |
| JSON::PP::encode_json | json, serialize | 5950 | 0.168 | 16.5 | 1.6e-07 | 20 |
| JSON::Tiny::encode_json | json, serialize | 9656.91 | 0.103553 | 26.8362 | 1.2e-11 | 27 |
| YAML::Syck::Dump | yaml, serialize | 17000 | 0.06 | 47 | 1e-07 | 22 |
| YAML::XS::Dump | yaml, serialize | 17000 | 0.0589 | 47.2 | 2.5e-08 | 22 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 110000 | 0.0091 | 310 | 1.7e-08 | 20 |
| JSON::MaybeXS::encode_json | json, serialize | 200000 | 0.0051 | 540 | 1.3e-08 | 20 |
| Cpanel::JSON::XS::encode_json | json, serialize | 200000 | 0.005 | 560 | 6.7e-09 | 20 |
| JSON::XS::encode_json | json, serialize | 210000 | 0.0048 | 580 | 6.7e-09 | 20 |
| JSON::Create::create_json | json, serialize | 260000 | 0.00385 | 722 | 1.6e-09 | 23 |
| Sereal::encode_sereal | binary, serialize | 275700 | 0.003627 | 766.2 | 5.8e-11 | 27 |
| Data::MessagePack::pack | binary, serialize | 280000 | 0.00357 | 779 | 1.5e-09 | 26 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table3#
{dataset=>"array_int_1000"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 37.1 | 26.9 | 1 | 9.4e-06 | 20 |
| JSON::PP::encode_json | json, serialize | 630 | 1.6 | 17 | 4.7e-06 | 20 |
| JSON::Tiny::encode_json | json, serialize | 992 | 1.01 | 26.7 | 6.9e-07 | 20 |
| YAML::Syck::Dump | yaml, serialize | 1700 | 0.59 | 46 | 1.1e-06 | 20 |
| YAML::XS::Dump | yaml, serialize | 1800 | 0.56 | 48 | 1.8e-06 | 21 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 15000 | 0.067 | 400 | 1.1e-07 | 20 |
| JSON::MaybeXS::encode_json | json, serialize | 21500 | 0.0466 | 578 | 1.3e-08 | 21 |
| Cpanel::JSON::XS::encode_json | json, serialize | 22300 | 0.0448 | 601 | 1.3e-08 | 20 |
| JSON::XS::encode_json | json, serialize | 22357 | 0.044728 | 602.44 | 4.6e-11 | 20 |
| JSON::Create::create_json | json, serialize | 25000 | 0.04 | 680 | 5.3e-08 | 20 |
| Sereal::encode_sereal | binary, serialize | 30000 | 0.033 | 820 | 4e-08 | 20 |
| Data::MessagePack::pack | binary, serialize | 30500 | 0.0327 | 823 | 1.2e-08 | 23 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table4#
{dataset=>"array_str1k_10"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 2300 | 430 | 1 | 4.8e-07 | 20 |
| YAML::XS::Dump | yaml, serialize | 7170 | 139 | 3.05 | 4.7e-08 | 26 |
| JSON::PP::encode_json | json, serialize | 11200 | 89.5 | 4.76 | 2.5e-08 | 22 |
| JSON::Tiny::encode_json | json, serialize | 18000 | 55.6 | 7.65 | 2.4e-08 | 24 |
| YAML::Syck::Dump | yaml, serialize | 20477.2 | 48.8347 | 8.71691 | 1.1e-11 | 20 |
| JSON::Create::create_json | json, serialize | 41300 | 24.2 | 17.6 | 6.1e-09 | 24 |
| JSON::MaybeXS::encode_json | json, serialize | 44000 | 23 | 19 | 2.7e-08 | 20 |
| Cpanel::JSON::XS::encode_json | json, serialize | 45000 | 22 | 19 | 2.7e-08 | 20 |
| JSON::XS::encode_json | json, serialize | 47100 | 21.2 | 20 | 5.4e-09 | 30 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 182000 | 5.48 | 77.7 | 5e-09 | 20 |
| Sereal::encode_sereal | binary, serialize | 330000 | 3.03 | 140 | 8.3e-10 | 20 |
| Data::MessagePack::pack | binary, serialize | 349000 | 2.87 | 148 | 2.4e-09 | 22 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table5#
{dataset=>"array_ustr1k_10"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 1000 | 999 | 1 | 4.8e-07 | 20 |
| JSON::Tiny::encode_json | json, serialize | 1090 | 916 | 1.09 | 6.9e-07 | 20 |
| JSON::PP::encode_json | json, serialize | 2050 | 488 | 2.05 | 5.3e-08 | 20 |
| YAML::XS::Dump | yaml, serialize | 3100 | 330 | 3.1 | 1.2e-06 | 25 |
| JSON::MaybeXS::encode_json | json, serialize | 3520 | 284 | 3.52 | 2.1e-07 | 20 |
| JSON::XS::encode_json | json, serialize | 3520 | 284 | 3.52 | 2.1e-07 | 20 |
| Cpanel::JSON::XS::encode_json | json, serialize | 3620 | 276 | 3.62 | 5.3e-08 | 20 |
| YAML::Syck::Dump | yaml, serialize | 7350 | 136 | 7.34 | 4.4e-08 | 30 |
| JSON::Create::create_json | json, serialize | 14807.4 | 67.5336 | 14.7914 | 1.1e-11 | 22 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 125000 | 8.02 | 125 | 3.3e-09 | 20 |
| Sereal::encode_sereal | binary, serialize | 182000 | 5.49 | 182 | 5e-09 | 20 |
| Data::MessagePack::pack | binary, serialize | 240000 | 4.3 | 240 | 6.7e-09 | 20 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table6#
{dataset=>"hash_int_10"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 2350 | 426 | 1 | 2.7e-07 | 20 |
| JSON::PP::encode_json | json, serialize | 21000 | 48 | 8.9 | 5.3e-08 | 20 |
| JSON::Tiny::encode_json | json, serialize | 30959 | 32.301 | 13.187 | 5.8e-11 | 23 |
| YAML::Syck::Dump | yaml, serialize | 55300 | 18.1 | 23.5 | 6.7e-09 | 20 |
| YAML::XS::Dump | yaml, serialize | 61000 | 16 | 26 | 6e-08 | 20 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 149000 | 6.72 | 63.4 | 3.3e-09 | 20 |
| JSON::MaybeXS::encode_json | json, serialize | 400000 | 2.5 | 170 | 3.3e-09 | 20 |
| Cpanel::JSON::XS::encode_json | json, serialize | 412000 | 2.43 | 175 | 7.8e-10 | 23 |
| Data::MessagePack::pack | binary, serialize | 440000 | 2.3 | 190 | 3.3e-09 | 20 |
| Sereal::encode_sereal | binary, serialize | 440000 | 2.2 | 190 | 3.3e-09 | 20 |
| JSON::XS::encode_json | json, serialize | 538000 | 1.86 | 229 | 7.9e-10 | 22 |
| JSON::Create::create_json | json, serialize | 580000 | 1.7 | 250 | 2.5e-09 | 20 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table7#
{dataset=>"hash_int_100"}
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 282 | 3.54 | 1 | 2.5e-06 | 20 |
| JSON::PP::encode_json | json, serialize | 2400 | 0.42 | 8.4 | 1.1e-06 | 20 |
| JSON::Tiny::encode_json | json, serialize | 3930 | 0.255 | 13.9 | 2.1e-07 | 21 |
| YAML::Syck::Dump | yaml, serialize | 7310 | 0.137 | 25.9 | 5.3e-08 | 20 |
| YAML::XS::Dump | yaml, serialize | 7500 | 0.13 | 26 | 2.1e-07 | 20 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 43000 | 0.023 | 150 | 2.7e-08 | 20 |
| JSON::MaybeXS::encode_json | json, serialize | 45000 | 0.022 | 160 | 2.3e-08 | 26 |
| Cpanel::JSON::XS::encode_json | json, serialize | 47000 | 0.021 | 170 | 4.6e-08 | 21 |
| Sereal::encode_sereal | binary, serialize | 47000 | 0.021 | 170 | 5.2e-08 | 21 |
| Data::MessagePack::pack | binary, serialize | 48000 | 0.021 | 170 | 2.4e-08 | 25 |
| JSON::XS::encode_json | json, serialize | 59000 | 0.017 | 210 | 2e-08 | 21 |
| JSON::Create::create_json | json, serialize | 64000 | 0.016 | 230 | 2.7e-08 | 20 |
+-------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table8#
{dataset=>"hash_int_1000"}
+-------------------------------+---------------------------------------+-----------+------------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+-------------------------------+---------------------------------------+-----------+------------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 28.8 | 34.7 | 1 | 1.8e-05 | 20 |
| JSON::PP::encode_json | json, serialize | 246 | 4.07 | 8.53 | 3.4e-06 | 20 |
| JSON::Tiny::encode_json | json, serialize | 398 | 2.51 | 13.8 | 1.3e-06 | 20 |
| YAML::Syck::Dump | yaml, serialize | 692 | 1.44 | 24 | 1.1e-06 | 21 |
| YAML::XS::Dump | yaml, serialize | 720 | 1.4 | 25 | 3.6e-06 | 20 |
| Sereal::encode_sereal | binary, serialize | 3900 | 0.257 | 135 | 2e-07 | 23 |
| Cpanel::JSON::XS::encode_json | json, serialize | 4100 | 0.25 | 140 | 2.6e-07 | 21 |
| JSON::MaybeXS::encode_json | json, serialize | 4080 | 0.245 | 142 | 1.6e-07 | 20 |
| Storable::freeze | binary, serialize, cant_handle_scalar | 4387.74 | 0.2279078 | 152.1144 | 1.1e-11 | 20 |
| Data::MessagePack::pack | binary, serialize | 4450 | 0.225 | 154 | 1.6e-07 | 20 |
| JSON::XS::encode_json | json, serialize | 5100 | 0.2 | 180 | 2.1e-07 | 20 |
| JSON::Create::create_json | json, serialize | 5360.643 | 0.1865448 | 185.8431 | 1.1e-11 | 21 |
+-------------------------------+---------------------------------------+-----------+------------+------------+---------+---------+
#table9#
{dataset=>"num"}
+-------------------------------+-------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+-------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 14380.5 | 69.5385 | 1 | 1.2e-11 | 22 |
| JSON::Tiny::encode_json | json, serialize | 151000 | 6.61 | 10.5 | 2.8e-09 | 28 |
| YAML::Syck::Dump | yaml, serialize | 152000 | 6.58 | 10.6 | 3.2e-09 | 22 |
| YAML::XS::Dump | yaml, serialize | 230000 | 4.4 | 16 | 6.7e-09 | 20 |
| JSON::PP::encode_json | json, serialize | 240000 | 4.16 | 16.7 | 1.7e-09 | 20 |
| JSON::MaybeXS::encode_json | json, serialize | 1500000 | 0.67 | 100 | 8.4e-10 | 20 |
| JSON::XS::encode_json | json, serialize | 1500000 | 0.65 | 110 | 8.1e-10 | 21 |
| Cpanel::JSON::XS::encode_json | json, serialize | 1500000 | 0.65 | 110 | 8.3e-10 | 20 |
| JSON::Create::create_json | json, serialize | 2300000 | 0.434 | 160 | 2.1e-10 | 20 |
| Sereal::encode_sereal | binary, serialize | 3000000 | 0.34 | 210 | 9e-10 | 27 |
| Data::MessagePack::pack | binary, serialize | 4210000 | 0.238 | 293 | 1e-10 | 20 |
+-------------------------------+-------------------+-----------+-----------+------------+---------+---------+
#table10#
{dataset=>"str1k"}
+-------------------------------+--------------------+-------------------+-----------+------------+------------+---------+---------+
| participant | ds_tags | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+--------------------+-------------------+-----------+------------+------------+---------+---------+
| YAML::Old::Dump | serialize, unicode | yaml, serialize | 7790 | 128 | 1 | 5e-08 | 23 |
| JSON::Tiny::encode_json | serialize, unicode | json, serialize | 10300 | 97.3 | 1.32 | 8e-08 | 20 |
| YAML::Old::Dump | serialize | yaml, serialize | 14000 | 70 | 1.8 | 1.1e-07 | 20 |
| JSON::PP::encode_json | serialize, unicode | json, serialize | 20100 | 49.8 | 2.58 | 4e-08 | 20 |
| JSON::XS::encode_json | serialize, unicode | json, serialize | 22000 | 45 | 2.9 | 2.7e-07 | 20 |
| JSON::MaybeXS::encode_json | serialize, unicode | json, serialize | 23000 | 43.5 | 2.95 | 1.3e-08 | 21 |
| Cpanel::JSON::XS::encode_json | serialize, unicode | json, serialize | 23800 | 41.9 | 3.06 | 4e-08 | 20 |
| YAML::XS::Dump | serialize, unicode | yaml, serialize | 30000 | 34 | 3.8 | 5.2e-08 | 21 |
| YAML::Syck::Dump | serialize, unicode | yaml, serialize | 56400 | 17.7 | 7.24 | 5.7e-09 | 27 |
| YAML::XS::Dump | serialize | yaml, serialize | 63400 | 15.8 | 8.14 | 5.5e-09 | 29 |
| JSON::PP::encode_json | serialize | json, serialize | 98600 | 10.1 | 12.7 | 3.1e-09 | 23 |
| YAML::Syck::Dump | serialize | yaml, serialize | 109000 | 9.21 | 13.9 | 3.2e-09 | 22 |
| JSON::Tiny::encode_json | serialize | json, serialize | 121000 | 8.27 | 15.5 | 2.8e-09 | 28 |
| JSON::Create::create_json | serialize, unicode | json, serialize | 147000 | 6.82 | 18.8 | 3.3e-09 | 20 |
| JSON::Create::create_json | serialize | json, serialize | 382000 | 2.62 | 49 | 8.3e-10 | 20 |
| JSON::MaybeXS::encode_json | serialize | json, serialize | 410000 | 2.5 | 52 | 3.2e-09 | 22 |
| Cpanel::JSON::XS::encode_json | serialize | json, serialize | 420000 | 2.4 | 54 | 3.3e-09 | 20 |
| JSON::XS::encode_json | serialize | json, serialize | 440000 | 2.3 | 56 | 3.3e-09 | 20 |
| Sereal::encode_sereal | serialize, unicode | binary, serialize | 2040000 | 0.489 | 262 | 2.1e-10 | 21 |
| Data::MessagePack::pack | serialize, unicode | binary, serialize | 2198930 | 0.454767 | 282.13 | 0 | 20 |
| Sereal::encode_sereal | serialize | binary, serialize | 2460000 | 0.407 | 315 | 5.8e-11 | 20 |
| Data::MessagePack::pack | serialize | binary, serialize | 2501780 | 0.399716 | 320.987 | 0 | 21 |
+-------------------------------+--------------------+-------------------+-----------+------------+------------+---------+---------+
#table11#
{dataset=>"undef"}
+-------------------------------+-------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+-------------------------------+-------------------+-----------+-----------+------------+---------+---------+
| YAML::Old::Dump | yaml, serialize | 17000 | 59 | 1 | 8e-08 | 20 |
| YAML::Syck::Dump | yaml, serialize | 194000 | 5.15 | 11.5 | 1.7e-09 | 20 |
| JSON::Tiny::encode_json | json, serialize | 278000 | 3.6 | 16.4 | 1.3e-09 | 32 |
| JSON::PP::encode_json | json, serialize | 420000 | 2.4 | 25 | 3.4e-09 | 20 |
| YAML::XS::Dump | yaml, serialize | 427000 | 2.34 | 25.2 | 8.3e-10 | 20 |
| Sereal::encode_sereal | binary, serialize | 3400000 | 0.3 | 200 | 4.2e-10 | 20 |
| JSON::MaybeXS::encode_json | json, serialize | 4100000 | 0.244 | 242 | 1.1e-10 | 24 |
| Cpanel::JSON::XS::encode_json | json, serialize | 4280000 | 0.233 | 253 | 1.1e-10 | 20 |
| Data::MessagePack::pack | binary, serialize | 4850000 | 0.206 | 286 | 1e-10 | 20 |
| JSON::XS::encode_json | json, serialize | 5044000 | 0.1983 | 297.6 | 1.1e-11 | 20 |
| JSON::Create::create_json | json, serialize | 5900000 | 0.17 | 350 | 3.9e-10 | 36 |
+-------------------------------+-------------------+-----------+-----------+------------+---------+---------+
Benchmark deserializing (bencher -m Serializers --include-participant-tags deserialize
):
#table12#
{dataset=>"json:array_int_10"}
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 1090 | 914 | 1 | 8.5e-07 | 20 |
| Pegex::JSON | json, deserialize | 1390 | 717 | 1.27 | 4.3e-07 | 20 |
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 4700 | 210 | 4.3 | 6.2e-07 | 21 |
| JSON::PP::decode_json | json, deserialize | 20600 | 48.6 | 18.8 | 1.3e-08 | 20 |
| JSON::Tiny::decode_json | json, deserialize | 30500 | 32.8 | 27.9 | 1.3e-08 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 30800 | 32.5 | 28.1 | 1.3e-08 | 20 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 65300 | 15.3 | 59.7 | 6.5e-09 | 21 |
| JSON::MaybeXS::decode_json | json, deserialize | 1520000 | 0.658 | 1390 | 2.1e-10 | 20 |
| JSON::XS::decode_json | json, deserialize | 1530000 | 0.653 | 1400 | 1.9e-10 | 24 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 1540000 | 0.651 | 1400 | 6.2e-10 | 20 |
| JSON::Parse::parse_json | json, deserialize | 1547000 | 0.6465 | 1414 | 1.2e-11 | 21 |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table13#
{dataset=>"json:array_int_100"}
+------------------------------------+---------------------------------------+------------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+------------+-----------+------------+---------+---------+
| Pegex::JSON | json, deserialize | 282 | 3.54 | 1 | 1.6e-06 | 20 |
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 360 | 2.8 | 1.3 | 3.1e-06 | 20 |
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 790 | 1.3 | 2.8 | 3.8e-06 | 20 |
| JSON::PP::decode_json | json, deserialize | 2230 | 0.449 | 7.9 | 2.1e-07 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 3801.717 | 0.263039 | 13.46595 | 1.1e-11 | 20 |
| JSON::Tiny::decode_json | json, deserialize | 4800 | 0.21 | 17 | 2.5e-07 | 22 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 7620 | 0.131 | 27 | 4.7e-08 | 26 |
| JSON::Parse::parse_json | json, deserialize | 253140 | 0.0039504 | 896.65 | 1.1e-11 | 30 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 265000 | 0.00378 | 938 | 1.7e-09 | 20 |
| JSON::XS::decode_json | json, deserialize | 266180 | 0.0037569 | 942.81 | 3.5e-11 | 28 |
| JSON::MaybeXS::decode_json | json, deserialize | 273000 | 0.00366 | 967 | 1.7e-09 | 20 |
+------------------------------------+---------------------------------------+------------+-----------+------------+---------+---------+
#table14#
{dataset=>"json:array_int_1000"}
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| Pegex::JSON | json, deserialize | 30.8 | 32.5 | 1 | 1.5e-05 | 20 |
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 44.3 | 22.6 | 1.44 | 1e-05 | 20 |
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 87 | 11.5 | 2.83 | 4.7e-06 | 20 |
| JSON::PP::decode_json | json, deserialize | 205 | 4.88 | 6.66 | 2.7e-06 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 390 | 2.56 | 12.7 | 1.6e-06 | 20 |
| JSON::Tiny::decode_json | json, deserialize | 510 | 2 | 17 | 2.5e-06 | 20 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 780 | 1.3 | 25 | 1.5e-06 | 20 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 31300 | 0.032 | 1020 | 9.8e-09 | 37 |
| JSON::MaybeXS::decode_json | json, deserialize | 31281 | 0.031968 | 1016 | 3.5e-11 | 30 |
| JSON::XS::decode_json | json, deserialize | 31500 | 0.0318 | 1020 | 1.2e-08 | 24 |
| JSON::Parse::parse_json | json, deserialize | 31916 | 0.031332 | 1036.6 | 3.5e-11 | 22 |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table15#
{dataset=>"json:array_str1k_10"}
+------------------------------------+---------------------------------------+-----------+------------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+-----------+------------+------------+---------+---------+
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 25.4 | 39.4 | 1 | 2.4e-05 | 21 |
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 97 | 10 | 3.8 | 1.1e-05 | 20 |
| JSON::PP::decode_json | json, deserialize | 144 | 6.94 | 5.68 | 5.8e-06 | 20 |
| Pegex::JSON | json, deserialize | 765 | 1.31 | 30.1 | 4.3e-07 | 20 |
| JSON::Tiny::decode_json | json, deserialize | 1440 | 0.694 | 56.8 | 2.7e-07 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 11114.6 | 0.0899721 | 438.126 | 1.1e-11 | 22 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 15300 | 0.0652 | 604 | 2.7e-08 | 20 |
| JSON::Parse::parse_json | json, deserialize | 37033 | 0.027003 | 1459.8 | 2.4e-10 | 31 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 52488.4 | 0.0190518 | 2069.05 | 1.2e-11 | 22 |
| JSON::MaybeXS::decode_json | json, deserialize | 52700 | 0.019 | 2080 | 6.1e-09 | 24 |
| JSON::XS::decode_json | json, deserialize | 68400 | 0.0146 | 2700 | 6.4e-09 | 22 |
+------------------------------------+---------------------------------------+-----------+------------+------------+---------+---------+
#table16#
{dataset=>"json:hash_int_10"}
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (μs) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 822 | 1220 | 1 | 4.8e-07 | 20 |
| Pegex::JSON | json, deserialize | 1020 | 980 | 1.24 | 8.5e-07 | 20 |
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 2300 | 430 | 2.8 | 9.1e-07 | 20 |
| JSON::PP::decode_json | json, deserialize | 10300 | 96.8 | 12.6 | 2.7e-08 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 14902.4 | 67.1033 | 18.1268 | 1e-11 | 21 |
| JSON::Tiny::decode_json | json, deserialize | 14946 | 66.909 | 18.18 | 1.8e-10 | 21 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 42100 | 23.8 | 51.2 | 6.7e-09 | 20 |
| JSON::MaybeXS::decode_json | json, deserialize | 806000 | 1.24 | 980 | 4.2e-10 | 20 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 810000 | 1.23 | 985 | 4.2e-10 | 20 |
| JSON::XS::decode_json | json, deserialize | 860000 | 1.2 | 1100 | 1.2e-09 | 20 |
| JSON::Parse::parse_json | json, deserialize | 883000 | 1.13 | 1070 | 3.9e-10 | 23 |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table17#
{dataset=>"json:hash_int_100"}
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| Pegex::JSON | json, deserialize | 163 | 6.15 | 1 | 4.6e-06 | 21 |
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 179 | 5.59 | 1.1 | 4.4e-06 | 20 |
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 280 | 3.57 | 1.72 | 2.5e-06 | 20 |
| JSON::PP::decode_json | json, deserialize | 1030 | 0.97 | 6.34 | 6.4e-07 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 1640 | 0.611 | 10.1 | 2.7e-07 | 20 |
| JSON::Tiny::decode_json | json, deserialize | 1820 | 0.55 | 11.2 | 2.1e-07 | 20 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 4500 | 0.22 | 28 | 2.7e-07 | 20 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 85000 | 0.012 | 520 | 5.7e-08 | 20 |
| JSON::Parse::parse_json | json, deserialize | 88000 | 0.011 | 540 | 1.3e-08 | 20 |
| JSON::MaybeXS::decode_json | json, deserialize | 88000 | 0.011 | 540 | 1.2e-08 | 26 |
| JSON::XS::decode_json | json, deserialize | 90600 | 0.011 | 557 | 1e-08 | 20 |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table18#
{dataset=>"json:hash_int_1000"}
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| participant | p_tags | rate (/s) | time (ms) | vs_slowest | errors | samples |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
| Pegex::JSON | json, deserialize | 17.1 | 58.5 | 1 | 5.8e-05 | 20 |
| JSON::Decode::Marpa::from_json | json, deserialize, cant_handle_scalar | 20 | 51 | 1.1 | 6.1e-05 | 21 |
| MarpaX::ESLIF::ECMA404::decode | json, deserialize | 25 | 41 | 1.4 | 5.1e-05 | 21 |
| JSON::PP::decode_json | json, deserialize | 98 | 10.2 | 5.73 | 6.7e-06 | 20 |
| JSON::Decode::Regexp::from_json | json, deserialize | 150 | 6.6 | 8.8 | 8.1e-06 | 20 |
| JSON::Tiny::decode_json | json, deserialize | 186 | 5.39 | 10.8 | 2.2e-06 | 20 |
| PERLANCAR::JSON::Match::match_json | json, deserialize | 440 | 2.3 | 26 | 3.1e-06 | 20 |
| Cpanel::JSON::XS::decode_json | json, deserialize | 6800 | 0.15 | 400 | 4.8e-07 | 20 |
| JSON::MaybeXS::decode_json | json, deserialize | 6900 | 0.15 | 400 | 2.1e-07 | 20 |
| JSON::Parse::parse_json | json, deserialize | 7000 | 0.14 | 410 | 2.1e-07 | 20 |
| JSON::XS::decode_json | json, deserialize | 7200 | 0.14 | 420 | 1.9e-07 | 24 |
+------------------------------------+---------------------------------------+-----------+-----------+------------+---------+---------+
#table19#
{dataset=>"json:null"}
+------------------------------------+-----------+-----------+------------+---------+---------+
| participant | rate (/s) | time (μs) | vs_slowest | errors | samples |
+------------------------------------+-----------+-----------+------------+---------+---------+
| Pegex::JSON | 2540 | 394 | 1 | 2.6e-07 | 21 |
| MarpaX::ESLIF::ECMA404::decode | 13000 | 77 | 5.1 | 1.3e-07 | 22 |
| JSON::Tiny::decode_json | 110000 | 9.4 | 42 | 1.7e-08 | 20 |
| JSON::PP::decode_json | 160000 | 6.1 | 64 | 1.5e-08 | 20 |
| JSON::Decode::Regexp::from_json | 248000 | 4.04 | 97.6 | 1.7e-09 | 20 |
| PERLANCAR::JSON::Match::match_json | 456000 | 2.19 | 180 | 8.3e-10 | 20 |
| JSON::MaybeXS::decode_json | 7289000 | 0.1372 | 2875 | 1.2e-11 | 22 |
| Cpanel::JSON::XS::decode_json | 7330000 | 0.136 | 2890 | 9.6e-11 | 24 |
| JSON::XS::decode_json | 7518000 | 0.133 | 2965 | 1.1e-11 | 20 |
| JSON::Parse::parse_json | 9000000 | 0.111 | 3550 | 6.6e-11 | 26 |
+------------------------------------+-----------+-----------+------------+---------+---------+
#table20#
{dataset=>"json:num"}
+------------------------------------+-----------+-----------+------------+---------+---------+
| participant | rate (/s) | time (μs) | vs_slowest | errors | samples |
+------------------------------------+-----------+-----------+------------+---------+---------+
| Pegex::JSON | 2640 | 379 | 1 | 2.1e-07 | 21 |
| MarpaX::ESLIF::ECMA404::decode | 13000 | 79 | 4.8 | 1.3e-07 | 20 |
| JSON::Tiny::decode_json | 78800 | 12.7 | 29.8 | 6.5e-09 | 21 |
| JSON::PP::decode_json | 84000 | 11.9 | 31.8 | 3.2e-09 | 22 |
| JSON::Decode::Regexp::from_json | 150000 | 6.6 | 57 | 1.1e-08 | 27 |
| PERLANCAR::JSON::Match::match_json | 259000 | 3.86 | 98.1 | 1.7e-09 | 20 |
| Cpanel::JSON::XS::decode_json | 960000 | 1 | 360 | 1.7e-09 | 20 |
| JSON::MaybeXS::decode_json | 970000 | 1 | 370 | 1.2e-09 | 20 |
| JSON::XS::decode_json | 980000 | 1 | 370 | 1.7e-09 | 20 |
| JSON::Parse::parse_json | 1200000 | 0.87 | 440 | 1.7e-09 | 20 |
+------------------------------------+-----------+-----------+------------+---------+---------+
#table21#
{dataset=>"json:str1k"}
+------------------------------------+-----------+-----------+------------+---------+---------+
| participant | rate (/s) | time (ms) | vs_slowest | errors | samples |
+------------------------------------+-----------+-----------+------------+---------+---------+
| MarpaX::ESLIF::ECMA404::decode | 269 | 3.71 | 1 | 3.7e-06 | 21 |
| JSON::PP::decode_json | 1430 | 0.699 | 5.31 | 2e-07 | 22 |
| Pegex::JSON | 2300 | 0.44 | 8.5 | 1.6e-06 | 20 |
| JSON::Tiny::decode_json | 12900 | 0.077517 | 47.911 | 1.4e-10 | 33 |
| JSON::Decode::Regexp::from_json | 96901 | 0.01032 | 359.88 | 1.2e-11 | 22 |
| PERLANCAR::JSON::Match::match_json | 136000 | 0.00736 | 505 | 2.8e-09 | 29 |
| JSON::Parse::parse_json | 372700 | 0.002683 | 1384 | 5.5e-11 | 22 |
| JSON::MaybeXS::decode_json | 525000 | 0.001905 | 1950 | 3.4e-11 | 20 |
| Cpanel::JSON::XS::decode_json | 527370 | 0.0018962 | 1958.6 | 1.1e-11 | 26 |
| JSON::XS::decode_json | 684590 | 0.0014607 | 2542.5 | 1.1e-11 | 20 |
+------------------------------------+-----------+-----------+------------+---------+---------+
Benchmark module startup overhead (bencher -m Serializers --module-startup
):
#table22#
+------------------------+------------------------------+--------------------+----------------+-----------+------------------------+------------+-----------+---------+
| participant | proc_private_dirty_size (MB) | proc_rss_size (MB) | proc_size (MB) | time (ms) | mod_overhead_time (ms) | vs_slowest | errors | samples |
+------------------------+------------------------------+--------------------+----------------+-----------+------------------------+------------+-----------+---------+
| JSON::Decode::Marpa | 1 | 5 | 20 | 200 | 190 | 1 | 0.0069 | 20 |
| YAML::XS | 1 | 4.5 | 22 | 58 | 48 | 2.9 | 0.00051 | 20 |
| JSON::PP | 3 | 7 | 30 | 40 | 30 | 4 | 0.0007 | 20 |
| Pegex::JSON | 1.9 | 5.4 | 27 | 28 | 18 | 6 | 0.00016 | 20 |
| JSON::Tiny | 2.3 | 5.7 | 25 | 25 | 15 | 6.8 | 9.7e-05 | 20 |
| JSON::MaybeXS | 1 | 5 | 20 | 20 | 10 | 7 | 0.00031 | 21 |
| Sereal | 1.5 | 6 | 29 | 19 | 9 | 8.6 | 0.00017 | 20 |
| YAML::Old | 20 | 20 | 50 | 20 | 10 | 9 | 0.00026 | 21 |
| Storable | 1.3 | 4.8 | 22 | 19 | 9 | 8.8 | 5e-05 | 20 |
| MarpaX::ESLIF::ECMA404 | 0.82 | 4.1 | 20 | 19 | 9 | 8.9 | 0.00016 | 21 |
| JSON::Parse | 1 | 4 | 20 | 20 | 10 | 10 | 0.00026 | 21 |
| YAML::Syck | 2 | 6 | 20 | 20 | 10 | 10 | 0.00021 | 21 |
| JSON::Create | 2 | 5 | 30 | 20 | 10 | 10 | 0.0002 | 20 |
| Cpanel::JSON::XS | 1.3 | 4.8 | 24 | 16 | 6 | 10 | 0.00015 | 20 |
| JSON::XS | 2.3 | 5.8 | 25 | 16 | 6 | 10 | 4.5e-05 | 21 |
| JSON::Decode::Regexp | 1.3 | 4.8 | 24 | 12 | 2 | 13 | 5e-05 | 20 |
| Data::MessagePack | 1.6 | 5 | 21 | 12 | 2 | 14 | 2.6e-05 | 20 |
| perl -e1 (baseline) | 3 | 7 | 30 | 10 | 0 | 20 | 0.00014 | 21 |
+------------------------+------------------------------+--------------------+----------------+-----------+------------------------+------------+-----------+---------+
To display as an interactive HTML table on a browser, you can add option --format html+datatables
.
HOMEPAGE
Please visit the project's homepage at https://metacpan.org/release/Bencher-Scenario-Serializers.
SOURCE
Source repository is at https://github.com/perlancar/perl-Bencher-Scenario-Serializers.
BUGS
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=Bencher-Scenario-Serializers
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
perlancar <perlancar@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2017, 2016, 2015 by perlancar@cpan.org.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.