|
|
var lib = __dirname + '/../lib'; var Protocol = require(lib + '/protocol/protocol'); var Packets = require(lib + '/protocol/packets'); var PacketWriter = require(lib + '/protocol/PacketWriter'); var Parser = require(lib + '/protocol/Parser');
var options = { rows : 100000, bufferSize : 64 * 1024, };
console.error('Config:', options);
function createBuffers() { var parser = new Parser();
process.stderr.write('Creating row buffers ... ');
var number = 1; var id = 0; var start = Date.now();
var buffers = [ createPacketBuffer(parser, new Packets.ResultSetHeaderPacket({fieldCount: 2})), createPacketBuffer(parser, new Packets.FieldPacket({catalog: 'foo', name: 'id'})), createPacketBuffer(parser, new Packets.FieldPacket({catalog: 'foo', name: 'text'})), createPacketBuffer(parser, new Packets.EofPacket()), ];
for (var i = 0; i < options.rows; i++) { buffers.push(createRowDataPacketBuffer(parser, number++)); }
buffers.push(createPacketBuffer(parser, new Packets.EofPacket));
buffers = mergeBuffers(buffers);
var bytes = buffers.reduce(function(bytes, buffer) { return bytes + buffer.length; }, 0);
var mb = (bytes / 1024 / 1024).toFixed(2)
console.error('%s buffers (%s mb) in %s ms', buffers.length, mb, (Date.now() - start));
return buffers; }
function createPacketBuffer(parser, packet) { var writer = new PacketWriter(); packet.write(writer); return writer.toBuffer(parser); }
function createRowDataPacketBuffer(parser, number) { var writer = new PacketWriter();
writer.writeLengthCodedString(parser._nextPacketNumber); writer.writeLengthCodedString('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has sur');
return writer.toBuffer(parser); }
function mergeBuffers(buffers) { var mergeBuffer = new Buffer(options.bufferSize); var mergeBuffers = []; var offset = 0;
for (var i = 0; i < buffers.length; i++) { var buffer = buffers[i];
var bytesRemaining = mergeBuffer.length - offset; if (buffer.length < bytesRemaining) { buffer.copy(mergeBuffer, offset); offset += buffer.length; } else { buffer.copy(mergeBuffer, offset, 0, bytesRemaining); mergeBuffers.push(mergeBuffer);
mergeBuffer = new Buffer(options.bufferSize); buffer.copy(mergeBuffer, 0, bytesRemaining); offset = buffer.length - bytesRemaining; } }
if (offset > 0) { mergeBuffers.push(mergeBuffer.slice(0, offset)); }
return mergeBuffers; }
function benchmark(buffers) { var protocol = new Protocol(); protocol._handshakeInitializationPacket = true; protocol.query({typeCast: false, sql: 'SELECT ...'});
var start = +new Date;
for (var i = 0; i < buffers.length; i++) { protocol.write(buffers[i]); }
var duration = Date.now() - start; var hz = Math.round(options.rows / (duration / 1000)); console.log(hz); }
var buffers = createBuffers(); while (true) { benchmark(buffers); }
|