summaryrefslogtreecommitdiff
path: root/benchmark/misc
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2015-03-19 17:31:34 -0400
committerBrian White <mscdex@mscdex.net>2015-03-25 00:34:34 -0400
commit8a945814dd61ddb547a4690788ea47cd7757f165 (patch)
tree0bbe36f54ad561fff62346a483776376d4d497cf /benchmark/misc
parent3d46fefe0cb5abf45bb6a21e5d0a377c58f0f896 (diff)
downloadandroid-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.js60
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);
+}