bench: version updates + add small Pg benchmark
This commit is contained in:
parent
8dbc17ab37
commit
383ed8409c
2 changed files with 149 additions and 76 deletions
|
|
@ -26,9 +26,11 @@ The following module versions were used:
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item L<Cpanel::JSON::XS> 4.38
|
=item L<Cpanel::JSON::XS> 4.39
|
||||||
|
|
||||||
=item L<FU> 0.1
|
=item L<DBD::Pg> 3.18.0
|
||||||
|
|
||||||
|
=item L<FU> 0.5
|
||||||
|
|
||||||
=item L<HTML::Tiny> 1.08
|
=item L<HTML::Tiny> 1.08
|
||||||
|
|
||||||
|
|
@ -40,6 +42,8 @@ The following module versions were used:
|
||||||
|
|
||||||
=item L<JSON::XS> 4.03
|
=item L<JSON::XS> 4.03
|
||||||
|
|
||||||
|
=item L<Pg::PQ> 0.15
|
||||||
|
|
||||||
=item L<TUWF::XML> 1.5
|
=item L<TUWF::XML> 1.5
|
||||||
|
|
||||||
=item L<XML::Writer> 0.900
|
=item L<XML::Writer> 0.900
|
||||||
|
|
@ -56,266 +60,294 @@ These benchmarks run on large-ish arrays with repeated values. JSON encoding is
|
||||||
sufficiently fast that Perl function calling overhead tends to dominate for
|
sufficiently fast that Perl function calling overhead tends to dominate for
|
||||||
smaller inputs, but I don't find that overhead very interesting.
|
smaller inputs, but I don't find that overhead very interesting.
|
||||||
|
|
||||||
Also worth noting that JSON::SIMD formatting code is forked from JSON::XS, the
|
Also worth noting that L<JSON::SIMD> formatting code is forked from
|
||||||
SIMD parts are only used for parsing.
|
L<JSON::XS>, the SIMD parts are only used for parsing.
|
||||||
|
|
||||||
API object from L<JSON::XS> documentation.
|
API object from L<JSON::XS> documentation.
|
||||||
|
|
||||||
Encode Canonical Decode
|
Encode Canonical Decode
|
||||||
JSON::PP 5312/s 5119/s 1290/s
|
JSON::PP 5312/s 5119/s 1290/s
|
||||||
JSON::Tiny 7757/s - 3426/s
|
JSON::Tiny 7757/s - 3426/s
|
||||||
Cpanel::JSON::XS 108187/s 101867/s 103575/s
|
Cpanel::JSON::XS 114802/s 104141/s 107274/s
|
||||||
JSON::SIMD 130137/s 118948/s 115123/s
|
JSON::SIMD 130137/s 118948/s 115123/s
|
||||||
JSON::XS 128421/s 120243/s 117940/s
|
JSON::XS 128421/s 120243/s 117940/s
|
||||||
FU::Util 133182/s 113275/s 118213/s
|
FU::Util 132890/s 111630/s 121124/s
|
||||||
|
|
||||||
Object (small)
|
Object (small)
|
||||||
|
|
||||||
Encode Canonical Decode
|
Encode Canonical Decode
|
||||||
JSON::PP 907/s 829/s 202/s
|
JSON::PP 907/s 829/s 202/s
|
||||||
JSON::Tiny 1224/s - 499/s
|
JSON::Tiny 1224/s - 499/s
|
||||||
Cpanel::JSON::XS 43168/s 28114/s 19229/s
|
Cpanel::JSON::XS 45732/s 30862/s 20102/s
|
||||||
JSON::SIMD 49019/s 30699/s 23267/s
|
JSON::SIMD 49019/s 30699/s 23267/s
|
||||||
JSON::XS 49814/s 31326/s 25336/s
|
JSON::XS 49814/s 31326/s 25336/s
|
||||||
FU::Util 44110/s 26134/s 21144/s
|
FU::Util 43853/s 26568/s 20426/s
|
||||||
|
|
||||||
Object (large)
|
Object (large)
|
||||||
|
|
||||||
Encode Canonical Decode
|
Encode Canonical Decode
|
||||||
JSON::PP 927/s 747/s 104/s
|
JSON::PP 927/s 747/s 104/s
|
||||||
JSON::Tiny 1108/s - 392/s
|
JSON::Tiny 1108/s - 392/s
|
||||||
Cpanel::JSON::XS 29672/s 12637/s 16609/s
|
Cpanel::JSON::XS 30587/s 11875/s 15515/s
|
||||||
JSON::SIMD 24418/s 12388/s 22895/s
|
JSON::SIMD 24418/s 12388/s 22895/s
|
||||||
JSON::XS 23192/s 13174/s 23553/s
|
JSON::XS 23192/s 13174/s 23553/s
|
||||||
FU::Util 39477/s 13567/s 17178/s
|
FU::Util 36455/s 11920/s 17370/s
|
||||||
|
|
||||||
Object (large, mixed unicode)
|
Object (large, mixed unicode)
|
||||||
|
|
||||||
Encode Canonical Decode
|
Encode Canonical Decode
|
||||||
JSON::PP 817/s 679/s 86/s
|
JSON::PP 817/s 679/s 86/s
|
||||||
JSON::Tiny 1036/s - 402/s
|
JSON::Tiny 1036/s - 402/s
|
||||||
Cpanel::JSON::XS 20437/s 1345/s 7408/s
|
Cpanel::JSON::XS 25333/s 1459/s 7480/s
|
||||||
JSON::SIMD 25031/s 1331/s 15997/s
|
JSON::SIMD 25031/s 1331/s 15997/s
|
||||||
JSON::XS 23580/s 1375/s 8526/s
|
JSON::XS 23580/s 1375/s 8526/s
|
||||||
FU::Util 34435/s 11916/s 9419/s
|
FU::Util 33085/s 12639/s 9375/s
|
||||||
|
|
||||||
Small integers
|
Small integers
|
||||||
|
|
||||||
Encode Decode
|
Encode Decode
|
||||||
JSON::PP 113/s 29/s
|
JSON::PP 113/s 29/s
|
||||||
JSON::Tiny 160/s 86/s
|
JSON::Tiny 160/s 86/s
|
||||||
Cpanel::JSON::XS 7137/s 6083/s
|
Cpanel::JSON::XS 7345/s 6151/s
|
||||||
JSON::SIMD 7963/s 4361/s
|
JSON::SIMD 7963/s 4361/s
|
||||||
JSON::XS 7915/s 6058/s
|
JSON::XS 7915/s 6058/s
|
||||||
FU::Util 8565/s 5639/s
|
FU::Util 7883/s 5671/s
|
||||||
|
|
||||||
Large integers
|
Large integers
|
||||||
|
|
||||||
Encode Decode
|
Encode Decode
|
||||||
JSON::PP 2176/s 329/s
|
JSON::PP 2176/s 329/s
|
||||||
JSON::Tiny 2999/s 1638/s
|
JSON::Tiny 2999/s 1638/s
|
||||||
Cpanel::JSON::XS 31302/s 48892/s
|
Cpanel::JSON::XS 32545/s 50162/s
|
||||||
JSON::SIMD 37201/s 51719/s
|
JSON::SIMD 37201/s 51719/s
|
||||||
JSON::XS 36722/s 50110/s
|
JSON::XS 36722/s 50110/s
|
||||||
FU::Util 116188/s 62110/s
|
FU::Util 110210/s 61006/s
|
||||||
|
|
||||||
ASCII strings
|
ASCII strings
|
||||||
|
|
||||||
Encode Decode
|
Encode Decode
|
||||||
JSON::PP 2934/s 336/s
|
JSON::PP 2934/s 336/s
|
||||||
JSON::Tiny 4126/s 1439/s
|
JSON::Tiny 4126/s 1439/s
|
||||||
Cpanel::JSON::XS 116744/s 43489/s
|
Cpanel::JSON::XS 116721/s 44560/s
|
||||||
JSON::SIMD 134711/s 50429/s
|
JSON::SIMD 134711/s 50429/s
|
||||||
JSON::XS 135419/s 43976/s
|
JSON::XS 135419/s 43976/s
|
||||||
FU::Util 182026/s 44312/s
|
FU::Util 164804/s 48163/s
|
||||||
|
|
||||||
Unicode strings
|
Unicode strings
|
||||||
|
|
||||||
Encode Decode
|
Encode Decode
|
||||||
JSON::PP 5113/s 253/s
|
JSON::PP 5113/s 253/s
|
||||||
JSON::Tiny 6603/s 2585/s
|
JSON::Tiny 6603/s 2585/s
|
||||||
Cpanel::JSON::XS 91704/s 64489/s
|
Cpanel::JSON::XS 97039/s 67669/s
|
||||||
JSON::SIMD 106928/s 102440/s
|
JSON::SIMD 106928/s 102440/s
|
||||||
JSON::XS 105473/s 60558/s
|
JSON::XS 105473/s 60558/s
|
||||||
FU::Util 217135/s 58972/s
|
FU::Util 187489/s 61121/s
|
||||||
|
|
||||||
String escaping (few)
|
String escaping (few)
|
||||||
|
|
||||||
Encode Decode
|
Encode Decode
|
||||||
JSON::PP 4251/s 352/s
|
JSON::PP 4251/s 352/s
|
||||||
JSON::Tiny 4704/s 1869/s
|
JSON::Tiny 4704/s 1869/s
|
||||||
Cpanel::JSON::XS 131789/s 106306/s
|
Cpanel::JSON::XS 136755/s 118059/s
|
||||||
JSON::SIMD 158171/s 153692/s
|
JSON::SIMD 158171/s 153692/s
|
||||||
JSON::XS 157261/s 97676/s
|
JSON::XS 157261/s 97676/s
|
||||||
FU::Util 191699/s 91177/s
|
FU::Util 216443/s 96354/s
|
||||||
|
|
||||||
String escaping (many)
|
String escaping (many)
|
||||||
|
|
||||||
Encode Decode
|
Encode Decode
|
||||||
JSON::PP 2224/s 366/s
|
JSON::PP 2224/s 366/s
|
||||||
JSON::Tiny 2884/s 984/s
|
JSON::Tiny 2884/s 984/s
|
||||||
Cpanel::JSON::XS 136583/s 100789/s
|
Cpanel::JSON::XS 140220/s 107040/s
|
||||||
JSON::SIMD 152951/s 113242/s
|
JSON::SIMD 152951/s 113242/s
|
||||||
JSON::XS 153471/s 106269/s
|
JSON::XS 153471/s 106269/s
|
||||||
FU::Util 142604/s 97984/s
|
FU::Util 153081/s 100279/s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 XML Writing
|
=head2 XML Writing
|
||||||
|
|
||||||
|
L<FU::XMLWriter> is the only XS-based XML DSL that I'm aware of, so all direct
|
||||||
|
competition is inherently slower by virtue of being pure perl. I'm sure some
|
||||||
|
templating modules will perform better, though.
|
||||||
|
|
||||||
HTML fragment
|
HTML fragment
|
||||||
|
|
||||||
TUWF::XML 795/s
|
TUWF::XML 795/s
|
||||||
XML::Writer 833/s
|
XML::Writer 833/s
|
||||||
HTML::Tiny 423/s
|
HTML::Tiny 423/s
|
||||||
FU::XMLWriter 5285/s
|
FU::XMLWriter 5396/s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head2 PostgreSQL client
|
||||||
|
|
||||||
|
Fetching query results is highly unlikely to be a bottleneck in your code, this
|
||||||
|
benchmark is mainly here to verify that L<FU::Pg> is not introducing a
|
||||||
|
bottleneck where there shouldn't be one.
|
||||||
|
|
||||||
|
Fetch and bitwise-or 20k integers
|
||||||
|
|
||||||
|
Smallint Bigint
|
||||||
|
DBD::Pg 194/s 22/s
|
||||||
|
Pg::PQ 226/s 19/s
|
||||||
|
FU::Pg (bin) 239/s 23/s
|
||||||
|
FU::Pg (text) 222/s 21/s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
# Cached data used by bench.PL. Same as the formatted tables above but easier to parse.
|
# Cached data used by bench.PL. Same as the formatted tables above but easier to parse.
|
||||||
json/api Canonical Cpanel::JSON::XS 101867
|
json/api Canonical Cpanel::JSON::XS 104141
|
||||||
json/api Canonical FU::Util 113275
|
json/api Canonical FU::Util 111630
|
||||||
json/api Canonical JSON::PP 5119
|
json/api Canonical JSON::PP 5119
|
||||||
json/api Canonical JSON::SIMD 118948
|
json/api Canonical JSON::SIMD 118948
|
||||||
json/api Canonical JSON::XS 120243
|
json/api Canonical JSON::XS 120243
|
||||||
json/api Decode Cpanel::JSON::XS 103575
|
json/api Decode Cpanel::JSON::XS 107274
|
||||||
json/api Decode FU::Util 118213
|
json/api Decode FU::Util 121124
|
||||||
json/api Decode JSON::PP 1290
|
json/api Decode JSON::PP 1290
|
||||||
json/api Decode JSON::SIMD 115123
|
json/api Decode JSON::SIMD 115123
|
||||||
json/api Decode JSON::Tiny 3426
|
json/api Decode JSON::Tiny 3426
|
||||||
json/api Decode JSON::XS 117940
|
json/api Decode JSON::XS 117940
|
||||||
json/api Encode Cpanel::JSON::XS 108187
|
json/api Encode Cpanel::JSON::XS 114802
|
||||||
json/api Encode FU::Util 133182
|
json/api Encode FU::Util 132890
|
||||||
json/api Encode JSON::PP 5312
|
json/api Encode JSON::PP 5312
|
||||||
json/api Encode JSON::SIMD 130137
|
json/api Encode JSON::SIMD 130137
|
||||||
json/api Encode JSON::Tiny 7757
|
json/api Encode JSON::Tiny 7757
|
||||||
json/api Encode JSON::XS 128421
|
json/api Encode JSON::XS 128421
|
||||||
json/intl Decode Cpanel::JSON::XS 48892
|
json/intl Decode Cpanel::JSON::XS 50162
|
||||||
json/intl Decode FU::Util 62110
|
json/intl Decode FU::Util 61006
|
||||||
json/intl Decode JSON::PP 329
|
json/intl Decode JSON::PP 329
|
||||||
json/intl Decode JSON::SIMD 51719
|
json/intl Decode JSON::SIMD 51719
|
||||||
json/intl Decode JSON::Tiny 1638
|
json/intl Decode JSON::Tiny 1638
|
||||||
json/intl Decode JSON::XS 50110
|
json/intl Decode JSON::XS 50110
|
||||||
json/intl Encode Cpanel::JSON::XS 31302
|
json/intl Encode Cpanel::JSON::XS 32545
|
||||||
json/intl Encode FU::Util 116188
|
json/intl Encode FU::Util 110210
|
||||||
json/intl Encode JSON::PP 2176
|
json/intl Encode JSON::PP 2176
|
||||||
json/intl Encode JSON::SIMD 37201
|
json/intl Encode JSON::SIMD 37201
|
||||||
json/intl Encode JSON::Tiny 2999
|
json/intl Encode JSON::Tiny 2999
|
||||||
json/intl Encode JSON::XS 36722
|
json/intl Encode JSON::XS 36722
|
||||||
json/ints Decode Cpanel::JSON::XS 6083
|
json/ints Decode Cpanel::JSON::XS 6151
|
||||||
json/ints Decode FU::Util 5639
|
json/ints Decode FU::Util 5671
|
||||||
json/ints Decode JSON::PP 29
|
json/ints Decode JSON::PP 29
|
||||||
json/ints Decode JSON::SIMD 4361
|
json/ints Decode JSON::SIMD 4361
|
||||||
json/ints Decode JSON::Tiny 86
|
json/ints Decode JSON::Tiny 86
|
||||||
json/ints Decode JSON::XS 6058
|
json/ints Decode JSON::XS 6058
|
||||||
json/ints Encode Cpanel::JSON::XS 7137
|
json/ints Encode Cpanel::JSON::XS 7345
|
||||||
json/ints Encode FU::Util 8565
|
json/ints Encode FU::Util 7883
|
||||||
json/ints Encode JSON::PP 113
|
json/ints Encode JSON::PP 113
|
||||||
json/ints Encode JSON::SIMD 7963
|
json/ints Encode JSON::SIMD 7963
|
||||||
json/ints Encode JSON::Tiny 160
|
json/ints Encode JSON::Tiny 160
|
||||||
json/ints Encode JSON::XS 7915
|
json/ints Encode JSON::XS 7915
|
||||||
json/objl Canonical Cpanel::JSON::XS 12637
|
json/objl Canonical Cpanel::JSON::XS 11875
|
||||||
json/objl Canonical FU::Util 13567
|
json/objl Canonical FU::Util 11920
|
||||||
json/objl Canonical JSON::PP 747
|
json/objl Canonical JSON::PP 747
|
||||||
json/objl Canonical JSON::SIMD 12388
|
json/objl Canonical JSON::SIMD 12388
|
||||||
json/objl Canonical JSON::XS 13174
|
json/objl Canonical JSON::XS 13174
|
||||||
json/objl Decode Cpanel::JSON::XS 16609
|
json/objl Decode Cpanel::JSON::XS 15515
|
||||||
json/objl Decode FU::Util 17178
|
json/objl Decode FU::Util 17370
|
||||||
json/objl Decode JSON::PP 104
|
json/objl Decode JSON::PP 104
|
||||||
json/objl Decode JSON::SIMD 22895
|
json/objl Decode JSON::SIMD 22895
|
||||||
json/objl Decode JSON::Tiny 392
|
json/objl Decode JSON::Tiny 392
|
||||||
json/objl Decode JSON::XS 23553
|
json/objl Decode JSON::XS 23553
|
||||||
json/objl Encode Cpanel::JSON::XS 29672
|
json/objl Encode Cpanel::JSON::XS 30587
|
||||||
json/objl Encode FU::Util 39477
|
json/objl Encode FU::Util 36455
|
||||||
json/objl Encode JSON::PP 927
|
json/objl Encode JSON::PP 927
|
||||||
json/objl Encode JSON::SIMD 24418
|
json/objl Encode JSON::SIMD 24418
|
||||||
json/objl Encode JSON::Tiny 1108
|
json/objl Encode JSON::Tiny 1108
|
||||||
json/objl Encode JSON::XS 23192
|
json/objl Encode JSON::XS 23192
|
||||||
json/objs Canonical Cpanel::JSON::XS 28114
|
json/objs Canonical Cpanel::JSON::XS 30862
|
||||||
json/objs Canonical FU::Util 26134
|
json/objs Canonical FU::Util 26568
|
||||||
json/objs Canonical JSON::PP 829
|
json/objs Canonical JSON::PP 829
|
||||||
json/objs Canonical JSON::SIMD 30699
|
json/objs Canonical JSON::SIMD 30699
|
||||||
json/objs Canonical JSON::XS 31326
|
json/objs Canonical JSON::XS 31326
|
||||||
json/objs Decode Cpanel::JSON::XS 19229
|
json/objs Decode Cpanel::JSON::XS 20102
|
||||||
json/objs Decode FU::Util 21144
|
json/objs Decode FU::Util 20426
|
||||||
json/objs Decode JSON::PP 202
|
json/objs Decode JSON::PP 202
|
||||||
json/objs Decode JSON::SIMD 23267
|
json/objs Decode JSON::SIMD 23267
|
||||||
json/objs Decode JSON::Tiny 499
|
json/objs Decode JSON::Tiny 499
|
||||||
json/objs Decode JSON::XS 25336
|
json/objs Decode JSON::XS 25336
|
||||||
json/objs Encode Cpanel::JSON::XS 43168
|
json/objs Encode Cpanel::JSON::XS 45732
|
||||||
json/objs Encode FU::Util 44110
|
json/objs Encode FU::Util 43853
|
||||||
json/objs Encode JSON::PP 907
|
json/objs Encode JSON::PP 907
|
||||||
json/objs Encode JSON::SIMD 49019
|
json/objs Encode JSON::SIMD 49019
|
||||||
json/objs Encode JSON::Tiny 1224
|
json/objs Encode JSON::Tiny 1224
|
||||||
json/objs Encode JSON::XS 49814
|
json/objs Encode JSON::XS 49814
|
||||||
json/obju Canonical Cpanel::JSON::XS 1345
|
json/obju Canonical Cpanel::JSON::XS 1459
|
||||||
json/obju Canonical FU::Util 11916
|
json/obju Canonical FU::Util 12639
|
||||||
json/obju Canonical JSON::PP 679
|
json/obju Canonical JSON::PP 679
|
||||||
json/obju Canonical JSON::SIMD 1331
|
json/obju Canonical JSON::SIMD 1331
|
||||||
json/obju Canonical JSON::XS 1375
|
json/obju Canonical JSON::XS 1375
|
||||||
json/obju Decode Cpanel::JSON::XS 7408
|
json/obju Decode Cpanel::JSON::XS 7480
|
||||||
json/obju Decode FU::Util 9419
|
json/obju Decode FU::Util 9375
|
||||||
json/obju Decode JSON::PP 86
|
json/obju Decode JSON::PP 86
|
||||||
json/obju Decode JSON::SIMD 15997
|
json/obju Decode JSON::SIMD 15997
|
||||||
json/obju Decode JSON::Tiny 402
|
json/obju Decode JSON::Tiny 402
|
||||||
json/obju Decode JSON::XS 8526
|
json/obju Decode JSON::XS 8526
|
||||||
json/obju Encode Cpanel::JSON::XS 20437
|
json/obju Encode Cpanel::JSON::XS 25333
|
||||||
json/obju Encode FU::Util 34435
|
json/obju Encode FU::Util 33085
|
||||||
json/obju Encode JSON::PP 817
|
json/obju Encode JSON::PP 817
|
||||||
json/obju Encode JSON::SIMD 25031
|
json/obju Encode JSON::SIMD 25031
|
||||||
json/obju Encode JSON::Tiny 1036
|
json/obju Encode JSON::Tiny 1036
|
||||||
json/obju Encode JSON::XS 23580
|
json/obju Encode JSON::XS 23580
|
||||||
json/strel Decode Cpanel::JSON::XS 100789
|
json/strel Decode Cpanel::JSON::XS 107040
|
||||||
json/strel Decode FU::Util 97984
|
json/strel Decode FU::Util 100279
|
||||||
json/strel Decode JSON::PP 366
|
json/strel Decode JSON::PP 366
|
||||||
json/strel Decode JSON::SIMD 113242
|
json/strel Decode JSON::SIMD 113242
|
||||||
json/strel Decode JSON::Tiny 984
|
json/strel Decode JSON::Tiny 984
|
||||||
json/strel Decode JSON::XS 106269
|
json/strel Decode JSON::XS 106269
|
||||||
json/strel Encode Cpanel::JSON::XS 136583
|
json/strel Encode Cpanel::JSON::XS 140220
|
||||||
json/strel Encode FU::Util 142604
|
json/strel Encode FU::Util 153081
|
||||||
json/strel Encode JSON::PP 2224
|
json/strel Encode JSON::PP 2224
|
||||||
json/strel Encode JSON::SIMD 152951
|
json/strel Encode JSON::SIMD 152951
|
||||||
json/strel Encode JSON::Tiny 2884
|
json/strel Encode JSON::Tiny 2884
|
||||||
json/strel Encode JSON::XS 153471
|
json/strel Encode JSON::XS 153471
|
||||||
json/stres Decode Cpanel::JSON::XS 106306
|
json/stres Decode Cpanel::JSON::XS 118059
|
||||||
json/stres Decode FU::Util 91177
|
json/stres Decode FU::Util 96354
|
||||||
json/stres Decode JSON::PP 352
|
json/stres Decode JSON::PP 352
|
||||||
json/stres Decode JSON::SIMD 153692
|
json/stres Decode JSON::SIMD 153692
|
||||||
json/stres Decode JSON::Tiny 1869
|
json/stres Decode JSON::Tiny 1869
|
||||||
json/stres Decode JSON::XS 97676
|
json/stres Decode JSON::XS 97676
|
||||||
json/stres Encode Cpanel::JSON::XS 131789
|
json/stres Encode Cpanel::JSON::XS 136755
|
||||||
json/stres Encode FU::Util 191699
|
json/stres Encode FU::Util 216443
|
||||||
json/stres Encode JSON::PP 4251
|
json/stres Encode JSON::PP 4251
|
||||||
json/stres Encode JSON::SIMD 158171
|
json/stres Encode JSON::SIMD 158171
|
||||||
json/stres Encode JSON::Tiny 4704
|
json/stres Encode JSON::Tiny 4704
|
||||||
json/stres Encode JSON::XS 157261
|
json/stres Encode JSON::XS 157261
|
||||||
json/strs Decode Cpanel::JSON::XS 43489
|
json/strs Decode Cpanel::JSON::XS 44560
|
||||||
json/strs Decode FU::Util 44312
|
json/strs Decode FU::Util 48163
|
||||||
json/strs Decode JSON::PP 336
|
json/strs Decode JSON::PP 336
|
||||||
json/strs Decode JSON::SIMD 50429
|
json/strs Decode JSON::SIMD 50429
|
||||||
json/strs Decode JSON::Tiny 1439
|
json/strs Decode JSON::Tiny 1439
|
||||||
json/strs Decode JSON::XS 43976
|
json/strs Decode JSON::XS 43976
|
||||||
json/strs Encode Cpanel::JSON::XS 116744
|
json/strs Encode Cpanel::JSON::XS 116721
|
||||||
json/strs Encode FU::Util 182026
|
json/strs Encode FU::Util 164804
|
||||||
json/strs Encode JSON::PP 2934
|
json/strs Encode JSON::PP 2934
|
||||||
json/strs Encode JSON::SIMD 134711
|
json/strs Encode JSON::SIMD 134711
|
||||||
json/strs Encode JSON::Tiny 4126
|
json/strs Encode JSON::Tiny 4126
|
||||||
json/strs Encode JSON::XS 135419
|
json/strs Encode JSON::XS 135419
|
||||||
json/stru Decode Cpanel::JSON::XS 64489
|
json/stru Decode Cpanel::JSON::XS 67669
|
||||||
json/stru Decode FU::Util 58972
|
json/stru Decode FU::Util 61121
|
||||||
json/stru Decode JSON::PP 253
|
json/stru Decode JSON::PP 253
|
||||||
json/stru Decode JSON::SIMD 102440
|
json/stru Decode JSON::SIMD 102440
|
||||||
json/stru Decode JSON::Tiny 2585
|
json/stru Decode JSON::Tiny 2585
|
||||||
json/stru Decode JSON::XS 60558
|
json/stru Decode JSON::XS 60558
|
||||||
json/stru Encode Cpanel::JSON::XS 91704
|
json/stru Encode Cpanel::JSON::XS 97039
|
||||||
json/stru Encode FU::Util 217135
|
json/stru Encode FU::Util 187489
|
||||||
json/stru Encode JSON::PP 5113
|
json/stru Encode JSON::PP 5113
|
||||||
json/stru Encode JSON::SIMD 106928
|
json/stru Encode JSON::SIMD 106928
|
||||||
json/stru Encode JSON::Tiny 6603
|
json/stru Encode JSON::Tiny 6603
|
||||||
json/stru Encode JSON::XS 105473
|
json/stru Encode JSON::XS 105473
|
||||||
xml/a Rate FU::XMLWriter 5285
|
pg/ints Bigint DBD::Pg 22
|
||||||
|
pg/ints Bigint FU::Pg (bin) 23
|
||||||
|
pg/ints Bigint FU::Pg (text) 21
|
||||||
|
pg/ints Bigint Pg::PQ 19
|
||||||
|
pg/ints Smallint DBD::Pg 194
|
||||||
|
pg/ints Smallint FU::Pg (bin) 239
|
||||||
|
pg/ints Smallint FU::Pg (text) 222
|
||||||
|
pg/ints Smallint Pg::PQ 226
|
||||||
|
xml/a Rate FU::XMLWriter 5396
|
||||||
xml/a Rate HTML::Tiny 423
|
xml/a Rate HTML::Tiny 423
|
||||||
xml/a Rate TUWF::XML 795
|
xml/a Rate TUWF::XML 795
|
||||||
xml/a Rate XML::Writer 833
|
xml/a Rate XML::Writer 833
|
||||||
|
|
|
||||||
45
bench.PL
45
bench.PL
|
|
@ -25,7 +25,10 @@ my %modules = map +($_, eval "require $_; \$${_}::VERSION"), qw/
|
||||||
TUWF::XML
|
TUWF::XML
|
||||||
HTML::Tiny
|
HTML::Tiny
|
||||||
XML::Writer
|
XML::Writer
|
||||||
|
DBD::Pg
|
||||||
|
Pg::PQ
|
||||||
/;
|
/;
|
||||||
|
use FU::Pg;
|
||||||
|
|
||||||
my %data; # "id x y" => { id x y rate exists }
|
my %data; # "id x y" => { id x y rate exists }
|
||||||
my %oldmodules;
|
my %oldmodules;
|
||||||
|
|
@ -196,6 +199,32 @@ def 'xml/a', 'HTML fragment', [ 'Rate' ],
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
die "FU_TEST_DB not set.\n" if !$ENV{FU_TEST_DB};
|
||||||
|
my $pq = Pg::PQ::Conn->new($ENV{FU_TEST_DB});
|
||||||
|
my $fu = FU::Pg->connect($ENV{FU_TEST_DB});
|
||||||
|
# XXX: Doesn't support all connection params this way
|
||||||
|
my $dbi = DBI->connect("dbi:Pg:dbname=".$pq->db, $pq->user, $pq->pass, {RaiseError => 1, PrintError => 0});
|
||||||
|
|
||||||
|
my $small = 'SELECT x, x+1, x+2, x+3, x+4, x+5, x+6, x+7, x+8, x+9 FROM generate_series(-10000::smallint, 9999, 10) x(x)';
|
||||||
|
my $big = 'SELECT x<<5, x<<10, x<<15, x<<20, x<<25, x<<30, x<<35, x<<40, x<<45, x<<50 FROM generate_series(1::bigint, 20000, 1) x(x)';
|
||||||
|
|
||||||
|
my sub dbi { my $sum = 0; my $st = $dbi->prepare_cached($_[0]); for my $row ($dbi->selectall_arrayref($st)->@*) { $sum ^= $_ for @$row; } }
|
||||||
|
my sub pq { my $sum = 0; $pq->prepare('' => $_[0]); for my $row ($pq->execQueryPrepared('')->rows) { $sum ^= $_ for @$row; } }
|
||||||
|
my sub fub { my $sum = 0; for my $row ($fu->q($_[0])->alla->@*) { $sum ^= $_ for @$row; } }
|
||||||
|
my sub fut { my $sum = 0; for my $row ($fu->q($_[0])->text->alla->@*) { $sum ^= $_ for @$row; } }
|
||||||
|
|
||||||
|
def 'pg/ints', 'Fetch and bitwise-or 20k integers', [ 'Smallint', 'Bigint' ],
|
||||||
|
[ 'DBD::Pg', undef, sub { dbi($small) }, sub { dbi($big) } ],
|
||||||
|
[ 'Pg::PQ', undef, sub { pq($small) }, sub { pq($big) } ],
|
||||||
|
[ 'FU::Pg (bin)', 'FU', sub { fub($small) }, sub { fub($big) } ],
|
||||||
|
[ 'FU::Pg (text)', 'FU', sub { fut($small) }, sub { fut($big) } ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
delete @data{ grep !$data{$_}{exists}, keys %data };
|
delete @data{ grep !$data{$_}{exists}, keys %data };
|
||||||
|
|
||||||
sub fmtbench($id, $text, $xs, $ys) {
|
sub fmtbench($id, $text, $xs, $ys) {
|
||||||
|
|
@ -276,15 +305,27 @@ These benchmarks run on large-ish arrays with repeated values. JSON encoding is
|
||||||
sufficiently fast that Perl function calling overhead tends to dominate for
|
sufficiently fast that Perl function calling overhead tends to dominate for
|
||||||
smaller inputs, but I don't find that overhead very interesting.
|
smaller inputs, but I don't find that overhead very interesting.
|
||||||
|
|
||||||
Also worth noting that JSON::SIMD formatting code is forked from JSON::XS, the
|
Also worth noting that L<JSON::SIMD> formatting code is forked from
|
||||||
SIMD parts are only used for parsing.
|
L<JSON::XS>, the SIMD parts are only used for parsing.
|
||||||
|
|
||||||
:benches ^json
|
:benches ^json
|
||||||
|
|
||||||
%head2 XML Writing
|
%head2 XML Writing
|
||||||
|
|
||||||
|
L<FU::XMLWriter> is the only XS-based XML DSL that I'm aware of, so all direct
|
||||||
|
competition is inherently slower by virtue of being pure perl. I'm sure some
|
||||||
|
templating modules will perform better, though.
|
||||||
|
|
||||||
:benches ^xml
|
:benches ^xml
|
||||||
|
|
||||||
|
%head2 PostgreSQL client
|
||||||
|
|
||||||
|
Fetching query results is highly unlikely to be a bottleneck in your code, this
|
||||||
|
benchmark is mainly here to verify that L<FU::Pg> is not introducing a
|
||||||
|
bottleneck where there shouldn't be one.
|
||||||
|
|
||||||
|
:benches ^pg
|
||||||
|
|
||||||
%cut
|
%cut
|
||||||
|
|
||||||
# Cached data used by bench.PL. Same as the formatted tables above but easier to parse.
|
# Cached data used by bench.PL. Same as the formatted tables above but easier to parse.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue