Skip to content

Instantly share code, notes, and snippets.

@skenqbx
Created September 23, 2012 22:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skenqbx/3773249 to your computer and use it in GitHub Desktop.
Save skenqbx/3773249 to your computer and use it in GitHub Desktop.
parser speed comparison node_redis vs. node-redjs

Two instances of each parser are created. Each test is run 10 times for each parser instance. One test consists of 65536 replies in one buffer.

sum is the time in ns for parsing ALL 655360 replies.

mean is the time in ns for parsing e.g. ONE +OK\r\n reply.

65536 x +OK\r\n
[ { name: 'redisv2_1', sum: 333492995, mean: 508.8699264526367 },
  { name: 'redjsv2_1', sum: 144464797, mean: 220.43578643798827 },
  { name: 'redisv2_2', sum: 200465605, mean: 305.88623809814453 },
  { name: 'redjsv2_2', sum: 148304758, mean: 226.29510192871095 } ]
65536 x -ERR Unknown command\r\n
[ { name: 'redisv2_1', sum: 841495954, mean: 1284.0209259033204 },
  { name: 'redjsv2_1', sum: 584473731, mean: 891.8361373901367 },
  { name: 'redisv2_2', sum: 834551578, mean: 1273.4246490478515 },
  { name: 'redjsv2_2', sum: 585647605, mean: 893.627326965332 } ]
65536 x :1\r\n
[ { name: 'redisv2_1', sum: 335402042, mean: 511.78290100097655 },
  { name: 'redjsv2_1', sum: 118247328, mean: 180.431103515625 },
  { name: 'redisv2_2', sum: 199370702, mean: 304.2155487060547 },
  { name: 'redjsv2_2', sum: 122943718, mean: 187.59722595214845 } ]
65536 x :32487216\r\n
[ { name: 'redisv2_1', sum: 587642318, mean: 896.6710174560546 },
  { name: 'redjsv2_1', sum: 400243945, mean: 610.7237930297852 },
  { name: 'redisv2_2', sum: 459096153, mean: 700.5251358032226 },
  { name: 'redjsv2_2', sum: 399526369, mean: 609.6288589477539 } ]
65536 x $11\r\nhello world\r\n
[ { name: 'redisv2_1', sum: 913061207, mean: 1393.220835876465 },
  { name: 'redjsv2_1', sum: 572391750, mean: 873.4004974365234 },
  { name: 'redisv2_2', sum: 663847384, mean: 1012.9507202148437 },
  { name: 'redjsv2_2', sum: 574731813, mean: 876.9711502075195 } ]
65536 x $62\r\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\r\n
[ { name: 'redisv2_1', sum: 965753458, mean: 1473.6228302001953 },
  { name: 'redjsv2_1', sum: 717923752, mean: 1095.4647094726563 },
  { name: 'redisv2_2', sum: 742469194, mean: 1132.9180816650392 },
  { name: 'redjsv2_2', sum: 719639203, mean: 1098.0822799682617 } ]
65536 x *2\r\n$11\r\nhello world\r\n$4\r\ntest\r\n
[ { name: 'redisv2_1', sum: 1749351947, mean: 2669.299235534668 },
  { name: 'redjsv2_1', sum: 989924903, mean: 1510.5055282592773 },
  { name: 'redisv2_2', sum: 1422842028, mean: 2171.084637451172 },
  { name: 'redjsv2_2', sum: 990478749, mean: 1511.3506301879884 } ]
65536 x *2\r\n$11\r\nhello world\r\n*2\r\n*2\r\n$-1\r\n:1\r\n$4\r\ntest\r\n
[ { name: 'redisv2_1', sum: 2901470376, mean: 4427.292443847657 },
  { name: 'redjsv2_1', sum: 1636275543, mean: 2496.758335876465 },
  { name: 'redisv2_2', sum: 2613921148, mean: 3988.5271423339846 },
  { name: 'redjsv2_2', sum: 1627842155, mean: 2483.890007019043 } ]
'use strict';
var ParserRedjsV2 = require('./lib/parser');
var ParserRedisV2 = require('./node_modules/redis/lib/parser/javascript').Parser;
var redisv2_1 = new ParserRedisV2({debug_mode: false});
redisv2_1.on('reply', function(result) {});
var redjsv2_1 = new ParserRedjsV2();
redjsv2_1.on('reply', function(type, result) {});
var redisv2_2 = new ParserRedisV2({debug_mode: false});
redisv2_2.on('reply', function(result) {});
var redjsv2_2 = new ParserRedjsV2();
redjsv2_2.on('reply', function(type, result) {});
var parsers = [
{name: 'redisv2_1', write: function(data) {
redisv2_1.execute(data);
}},
{name: 'redjsv2_1', write: function(data) {
redjsv2_1.write(data);
}},
{name: 'redisv2_2', write: function(data) {
redisv2_2.execute(data);
}},
{name: 'redjsv2_2', write: function(data) {
redjsv2_2.write(data);
}},
];
function test(parsers, data, numRuns) {
var d, j;
var results = [];
var l = parsers.length;
var i = numRuns * l;
var tx = 0;
var txc = 1;
var data_ = data;
do {
txc += txc;
data += data;
} while (++tx < 16);
console.log('%s x %s', txc, data_.replace(/\r\n/g, '\\r\\n'));
data = new Buffer(data);
do {
j = i % l;
d = process.hrtime();
parsers[j].write(data);
d = process.hrtime(d);
results[j] = results[j] || {name: parsers[j].name, sum: 0, mean: 0};
results[j].sum += ((d[0] * 1e9) + d[1]);
results[j].mean = results[j].sum / numRuns / txc;
} while (--i);
console.log(results);
}
var count = 10;
test(parsers, '+OK\r\n', count);
test(parsers, '-ERR Unknown command\r\n', count);
test(parsers, ':1\r\n', count);
test(parsers, ':32487216\r\n', count);
test(parsers, '$11\r\nhello world\r\n', count);
test(parsers, '$62\r\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\r\n', count);
test(parsers, '*2\r\n$11\r\nhello world\r\n$4\r\ntest\r\n', count);
test(parsers, '*2\r\n$11\r\nhello world\r\n*2\r\n*2\r\n$-1\r\n:1\r\n$4\r\ntest\r\n', count);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment