From c981614a945cce8143ded17a0038578d55c324c7 Mon Sep 17 00:00:00 2001 From: Duane Johnson Date: Wed, 9 Aug 2023 14:40:23 -0600 Subject: [PATCH] Lazily create encoder for IncomingMessage Approximately 2/3 of the initialization time of `new IncomingMessage` is taken by the `createEncoder` call within IncomingMessage's constructor. The vast majority of IncomingMessage usage is to decode the incoming message first to determine if it is relevant--i.e. to determine what document it belongs to. This change improves performance by avoiding the `createEncoder` call until we know it is actually necessary. --- packages/server/src/IncomingMessage.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/server/src/IncomingMessage.ts b/packages/server/src/IncomingMessage.ts index 790e3e14b..1fc04832d 100644 --- a/packages/server/src/IncomingMessage.ts +++ b/packages/server/src/IncomingMessage.ts @@ -24,17 +24,23 @@ export class IncomingMessage { /** * Access to the reply. */ - encoder: Encoder + private encoderInternal?: Encoder constructor(input: any) { if (!(input instanceof Uint8Array)) { input = new Uint8Array(input) } - this.encoder = createEncoder() this.decoder = createDecoder(input) } + get encoder() { + if (!this.encoderInternal) { + this.encoderInternal = createEncoder() + } + return this.encoderInternal + } + readVarUint8Array() { return readVarUint8Array(this.decoder) }