Skip to content

string_decoder: optimize write()

By limiting property getting/setting to only where they are absolutely necessary, we can achieve greater performance especially with small utf8 inputs and any size base64 inputs.

ascii/binary are unaffected.

Example results for utf8 and base64 from the included benchmark:

misc/string-decode.js encoding=utf8 inlen=32 chunk=16 n=250000: ./iojs: 1946800 ./iojs-io.js-4655521: 1654400 ........... 17.67%
misc/string-decode.js encoding=utf8 inlen=32 chunk=64 n=250000: ./iojs: 2838500 ./iojs-io.js-4655521: 2545000 ........... 11.53%
misc/string-decode.js encoding=utf8 inlen=32 chunk=256 n=250000: ./iojs: 2822200 ./iojs-io.js-4655521: 2522400 .......... 11.88%
misc/string-decode.js encoding=utf8 inlen=32 chunk=1024 n=250000: ./iojs: 2829100 ./iojs-io.js-4655521: 2507800 ......... 12.81%
misc/string-decode.js encoding=utf8 inlen=128 chunk=16 n=250000: ./iojs: 508720 ./iojs-io.js-4655521: 499830 ............. 1.78%
misc/string-decode.js encoding=utf8 inlen=128 chunk=64 n=250000: ./iojs: 1016400 ./iojs-io.js-4655521: 931340 ............ 9.13%
misc/string-decode.js encoding=utf8 inlen=128 chunk=256 n=250000: ./iojs: 1250200 ./iojs-io.js-4655521: 1179200 .......... 6.02%
misc/string-decode.js encoding=utf8 inlen=128 chunk=1024 n=250000: ./iojs: 1258600 ./iojs-io.js-4655521: 1193400 ......... 5.46%
misc/string-decode.js encoding=utf8 inlen=1024 chunk=16 n=250000: ./iojs: 64944 ./iojs-io.js-4655521: 64852 .............. 0.14%
misc/string-decode.js encoding=utf8 inlen=1024 chunk=64 n=250000: ./iojs: 134380 ./iojs-io.js-4655521: 133250 ............ 0.85%
misc/string-decode.js encoding=utf8 inlen=1024 chunk=256 n=250000: ./iojs: 178810 ./iojs-io.js-4655521: 176190 ........... 1.49%
misc/string-decode.js encoding=utf8 inlen=1024 chunk=1024 n=250000: ./iojs: 215380 ./iojs-io.js-4655521: 212140 .......... 1.52%
misc/string-decode.js encoding=base64-utf8 inlen=32 chunk=16 n=250000: ./iojs: 407580 ./iojs-io.js-4655521: 307650 ...... 32.48%
misc/string-decode.js encoding=base64-utf8 inlen=32 chunk=64 n=250000: ./iojs: 1422000 ./iojs-io.js-4655521: 1120100 .... 26.96%
misc/string-decode.js encoding=base64-utf8 inlen=32 chunk=256 n=250000: ./iojs: 1416700 ./iojs-io.js-4655521: 1160400 ... 22.09%
misc/string-decode.js encoding=base64-utf8 inlen=32 chunk=1024 n=250000: ./iojs: 1339300 ./iojs-io.js-4655521: 1140600 .. 17.42%
misc/string-decode.js encoding=base64-utf8 inlen=128 chunk=16 n=250000: ./iojs: 93840 ./iojs-io.js-4655521: 84048 ....... 11.65%
misc/string-decode.js encoding=base64-utf8 inlen=128 chunk=64 n=250000: ./iojs: 383150 ./iojs-io.js-4655521: 308310 ..... 24.28%
misc/string-decode.js encoding=base64-utf8 inlen=128 chunk=256 n=250000: ./iojs: 1067600 ./iojs-io.js-4655521: 886690 ... 20.41%
misc/string-decode.js encoding=base64-utf8 inlen=128 chunk=1024 n=250000: ./iojs: 1011700 ./iojs-io.js-4655521: 926400 ... 9.21%
misc/string-decode.js encoding=base64-utf8 inlen=1024 chunk=16 n=250000: ./iojs: 13682 ./iojs-io.js-4655521: 10591 ...... 29.19%
misc/string-decode.js encoding=base64-utf8 inlen=1024 chunk=64 n=250000: ./iojs: 48976 ./iojs-io.js-4655521: 39895 ...... 22.76%
misc/string-decode.js encoding=base64-utf8 inlen=1024 chunk=256 n=250000: ./iojs: 141090 ./iojs-io.js-4655521: 120230 ... 17.35%
misc/string-decode.js encoding=base64-utf8 inlen=1024 chunk=1024 n=250000: ./iojs: 269880 ./iojs-io.js-4655521: 244070 .. 10.57%
misc/string-decode.js encoding=base64-ascii inlen=32 chunk=16 n=250000: ./iojs: 497550 ./iojs-io.js-4655521: 396600 ..... 25.45%
misc/string-decode.js encoding=base64-ascii inlen=32 chunk=64 n=250000: ./iojs: 1521700 ./iojs-io.js-4655521: 1174800 ... 29.52%
misc/string-decode.js encoding=base64-ascii inlen=32 chunk=256 n=250000: ./iojs: 1487500 ./iojs-io.js-4655521: 1174100 .. 26.69%
misc/string-decode.js encoding=base64-ascii inlen=32 chunk=1024 n=250000: ./iojs: 1401600 ./iojs-io.js-4655521: 1155800 . 21.27%
misc/string-decode.js encoding=base64-ascii inlen=128 chunk=16 n=250000: ./iojs: 142030 ./iojs-io.js-4655521: 114770 .... 23.75%
misc/string-decode.js encoding=base64-ascii inlen=128 chunk=64 n=250000: ./iojs: 499170 ./iojs-io.js-4655521: 396290 .... 25.96%
misc/string-decode.js encoding=base64-ascii inlen=128 chunk=256 n=250000: ./iojs: 1145200 ./iojs-io.js-4655521: 999490 .. 14.57%
misc/string-decode.js encoding=base64-ascii inlen=128 chunk=1024 n=250000: ./iojs: 1207200 ./iojs-io.js-4655521: 983240 . 22.77%
misc/string-decode.js encoding=base64-ascii inlen=1024 chunk=16 n=250000: ./iojs: 18163 ./iojs-io.js-4655521: 14729 ..... 23.31%
misc/string-decode.js encoding=base64-ascii inlen=1024 chunk=64 n=250000: ./iojs: 69888 ./iojs-io.js-4655521: 60726 ..... 15.09%
misc/string-decode.js encoding=base64-ascii inlen=1024 chunk=256 n=250000: ./iojs: 194780 ./iojs-io.js-4655521: 141810 .. 37.36%
misc/string-decode.js encoding=base64-ascii inlen=1024 chunk=1024 n=250000: ./iojs: 356430 ./iojs-io.js-4655521: 342270 .. 4.14%

Merge request reports

Loading