123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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);
- }
|