You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.1 KiB
112 lines
3.1 KiB
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);
|
|
}
|