Skip to content

Commit 1100f90

Browse files
committed
Performance improvements for writing packets to network
1 parent 2c16030 commit 1100f90

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

Changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ you spot any mistakes.
1717
* Performance improvements for array/object escaping in SqlString #1331
1818
* Performance improvements for formatting in SqlString #1431
1919
* Performance improvements for string escaping in SqlString #1390
20+
* Performance improvements for writing packets to network
2021
* Support Node.js 6.x
2122
* Update `bignumber.js` to 2.3.0
2223
* Update `readable-stream` to 1.1.14

lib/protocol/PacketWriter.js

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
1-
var BIT_16 = Math.pow(2, 16);
2-
var BIT_24 = Math.pow(2, 24);
1+
var BIT_16 = Math.pow(2, 16);
2+
var BIT_24 = Math.pow(2, 24);
3+
var BUFFER_ALLOC_SIZE = Math.pow(2, 8);
34
// The maximum precision JS Numbers can hold precisely
45
// Don't panic: Good enough to represent byte values up to 8192 TB
56
var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53);
67
var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1;
78

89
module.exports = PacketWriter;
910
function PacketWriter() {
10-
this._buffer = new Buffer(0);
11+
this._buffer = null;
1112
this._offset = 0;
1213
}
1314

14-
PacketWriter.prototype.toBuffer = function(parser) {
15-
var packets = Math.floor(this._buffer.length / MAX_PACKET_LENGTH) + 1;
16-
var buffer = this._buffer;
17-
this._buffer = new Buffer(this._buffer.length + packets * 4);
15+
PacketWriter.prototype.toBuffer = function toBuffer(parser) {
16+
if (!this._buffer) {
17+
this._buffer = new Buffer(0);
18+
this._offset = 0;
19+
}
1820

19-
for (var packet = 0; packet < packets; packet++) {
20-
this._offset = packet * (MAX_PACKET_LENGTH + 4);
21+
var buffer = this._buffer;
22+
var length = this._offset;
23+
var packets = Math.floor(length / MAX_PACKET_LENGTH) + 1;
2124

25+
this._buffer = new Buffer(length + packets * 4);
26+
this._offset = 0;
27+
28+
for (var packet = 0; packet < packets; packet++) {
2229
var isLast = (packet + 1 === packets);
2330
var packetLength = (isLast)
24-
? buffer.length % MAX_PACKET_LENGTH
31+
? length % MAX_PACKET_LENGTH
2532
: MAX_PACKET_LENGTH;
2633

2734
var packetNumber = parser.incrementPacketNumber();
@@ -179,9 +186,10 @@ PacketWriter.prototype.writeLengthCodedString = function(value) {
179186
this._offset += bytes;
180187
};
181188

182-
PacketWriter.prototype._allocate = function(bytes) {
189+
PacketWriter.prototype._allocate = function _allocate(bytes) {
183190
if (!this._buffer) {
184-
this._buffer = new Buffer(bytes);
191+
this._buffer = new Buffer(BUFFER_ALLOC_SIZE);
192+
this._offset = 0;
185193
return;
186194
}
187195

@@ -190,8 +198,9 @@ PacketWriter.prototype._allocate = function(bytes) {
190198
return;
191199
}
192200

201+
var newSize = this._buffer.length + Math.max(BUFFER_ALLOC_SIZE, bytes);
193202
var oldBuffer = this._buffer;
194203

195-
this._buffer = new Buffer(oldBuffer.length + bytes);
204+
this._buffer = new Buffer(newSize);
196205
oldBuffer.copy(this._buffer);
197206
};

0 commit comments

Comments
 (0)