querystring: optimize parse and stringify
parse optimizations:
- Move try-catch to separate function to keep entire function from being deoptimized.
- Use key array lookup instead of using hasOwnProperty.
- Avoid decoding known empty strings.
- Avoid possibly unnecessary switch to slower decoder for values if key decoding throws.
stringify optimizations:
- Use manual loop for default encoder instead of encodeURIComponent.
- Use string concatenation instead of joining an array of strings.
- Avoid caching result of typeof.
Results with benchmarks from #846:
querystring/querystring-parse.js type=noencode n=1000000: ./iojs-after: 296290 ./iojs-before: 224220 ........ 32.14%
querystring/querystring-parse.js type=encodemany n=1000000: ./iojs-after: 263410 ./iojs-before: 213780 ...... 23.22%
querystring/querystring-parse.js type=encodelast n=1000000: ./iojs-after: 284420 ./iojs-before: 194230 ...... 46.44%
querystring/querystring-stringify.js type=noencode n=1000000: ./iojs-after: 983630 ./iojs-before: 610680 .... 61.07%
querystring/querystring-stringify.js type=encodemany n=1000000: ./iojs-after: 857700 ./iojs-before: 187150 . 358.30%
querystring/querystring-stringify.js type=encodelast n=1000000: ./iojs-after: 987650 ./iojs-before: 290730 . 239.72%