mirror of
https://github.com/wassname/HackFlowy.git
synced 2026-09-11 11:50:25 +08:00
Initial work on the server
This commit is contained in:
+112
@@ -0,0 +1,112 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user