diff options
author | Brian White <mscdex@mscdex.net> | 2015-03-19 17:31:34 -0400 |
---|---|---|
committer | Brian White <mscdex@mscdex.net> | 2015-03-25 00:34:34 -0400 |
commit | 8a945814dd61ddb547a4690788ea47cd7757f165 (patch) | |
tree | 0bbe36f54ad561fff62346a483776376d4d497cf /benchmark/misc | |
parent | 3d46fefe0cb5abf45bb6a21e5d0a377c58f0f896 (diff) | |
download | android-node-v8-8a945814dd61ddb547a4690788ea47cd7757f165.tar.gz android-node-v8-8a945814dd61ddb547a4690788ea47cd7757f165.tar.bz2 android-node-v8-8a945814dd61ddb547a4690788ea47cd7757f165.zip |
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.
PR-URL: https://github.com/iojs/io.js/pull/1209
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Nicu Micleușanu <micnic90@gmail.com>
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
Diffstat (limited to 'benchmark/misc')
-rw-r--r-- | benchmark/misc/string-decoder.js | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/benchmark/misc/string-decoder.js b/benchmark/misc/string-decoder.js new file mode 100644 index 0000000000..14563cee0d --- /dev/null +++ b/benchmark/misc/string-decoder.js @@ -0,0 +1,60 @@ +var common = require('../common.js'); +var StringDecoder = require('string_decoder').StringDecoder; + +var bench = common.createBenchmark(main, { + encoding: ['ascii', 'utf8', 'base64-utf8', 'base64-ascii'], + inlen: [32, 128, 1024], + chunk: [16, 64, 256, 1024], + n: [25e4] +}); + +var UTF_ALPHA = 'Blåbærsyltetøy'; +var ASC_ALPHA = 'Blueberry jam'; + +function main(conf) { + var encoding = conf.encoding; + var inLen = conf.inlen | 0; + var chunkLen = conf.chunk | 0; + var n = conf.n | 0; + + var alpha; + var chunks = []; + var str = ''; + var isBase64 = (encoding === 'base64-ascii' || encoding === 'base64-utf8'); + + if (encoding === 'ascii' || encoding === 'base64-ascii') + alpha = ASC_ALPHA; + else if (encoding === 'utf8' || encoding === 'base64-utf8') + alpha = UTF_ALPHA; + else + throw new Error('Bad encoding'); + + var sd = new StringDecoder(isBase64 ? 'base64' : encoding); + + for (var i = 0; i < inLen; ++i) { + if (i > 0 && (i % chunkLen) === 0 && !isBase64) { + chunks.push(new Buffer(str, encoding)); + str = ''; + } + str += alpha[i % alpha.length]; + } + if (str.length > 0 && !isBase64) + chunks.push(new Buffer(str, encoding)); + if (isBase64) { + str = new Buffer(str, 'utf8').toString('base64'); + while (str.length > 0) { + var len = Math.min(chunkLen, str.length); + chunks.push(new Buffer(str.substring(0, len), 'utf8')); + str = str.substring(len); + } + } + + var nChunks = chunks.length; + + bench.start(); + for (var i = 0; i < n; ++i) { + for (var j = 0; j < nChunks; ++j) + sd.write(chunks[j]); + } + bench.end(n); +} |