Skip to content

Commit 3ca9e65

Browse files
CaramelFurtargos
authored andcommitted
child_process: improve ipc write performance
PR-URL: #42931 Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Zeyu "Alex" Yang <[email protected]>
1 parent cad6d99 commit 3ca9e65

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

lib/internal/child_process/serialization.js

+22-12
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const {
55
JSONStringify,
66
StringPrototypeSplit,
77
ArrayPrototypePush,
8-
ReflectApply,
98
Symbol,
109
TypedArrayPrototypeSubarray,
1110
} = primordials;
@@ -15,7 +14,6 @@ const v8 = require('v8');
1514
const { isArrayBufferView } = require('internal/util/types');
1615
const assert = require('internal/assert');
1716
const { streamBaseState, kLastWriteWasAsync } = internalBinding('stream_wrap');
18-
const { readUInt32BE } = require('internal/buffer');
1917

2018
const kMessageBuffer = Symbol('kMessageBuffer');
2119
const kMessageBufferSize = Symbol('kMessageBufferSize');
@@ -71,7 +69,12 @@ const advanced = {
7169
while (messageBufferHead.length >= 4) {
7270
// We call `readUInt32BE` manually here, because this is faster than first converting
7371
// it to a buffer and using `readUInt32BE` on that.
74-
const fullMessageSize = ReflectApply(readUInt32BE, messageBufferHead, [0]) + 4;
72+
const fullMessageSize = (
73+
messageBufferHead[0] << 24 |
74+
messageBufferHead[1] << 16 |
75+
messageBufferHead[2] << 8 |
76+
messageBufferHead[3]
77+
) + 4;
7578

7679
if (channel[kMessageBufferSize] < fullMessageSize) break;
7780

@@ -100,20 +103,27 @@ const advanced = {
100103

101104
writeChannelMessage(channel, req, message, handle) {
102105
const ser = new ChildProcessSerializer();
106+
// Add 4 bytes, to later populate with message length
107+
ser.writeRawBytes(Buffer.allocUnsafe(4));
103108
ser.writeHeader();
104109
ser.writeValue(message);
110+
105111
const serializedMessage = ser.releaseBuffer();
106-
const sizeBuffer = Buffer.allocUnsafe(4);
107-
sizeBuffer.writeUInt32BE(serializedMessage.length);
108-
109-
const buffer = Buffer.concat([
110-
sizeBuffer,
111-
serializedMessage,
112-
]);
113-
const result = channel.writeBuffer(req, buffer, handle);
112+
const serializedMessageLength = serializedMessage.length - 4;
113+
114+
serializedMessage.set([
115+
serializedMessageLength >> 24 & 0xFF,
116+
serializedMessageLength >> 16 & 0xFF,
117+
serializedMessageLength >> 8 & 0xFF,
118+
serializedMessageLength & 0xFF,
119+
], 0);
120+
121+
const result = channel.writeBuffer(req, serializedMessage, handle);
122+
114123
// Mirror what stream_base_commons.js does for Buffer retention.
115124
if (streamBaseState[kLastWriteWasAsync])
116-
req.buffer = buffer;
125+
req.buffer = serializedMessage;
126+
117127
return result;
118128
},
119129
};

0 commit comments

Comments
 (0)