From 9ae91d88b6166dfbbd82bd6ce2ef7341e3e725df Mon Sep 17 00:00:00 2001 From: Alex Kanunnikov Date: Wed, 6 Dec 2023 00:56:59 +0300 Subject: [PATCH] [perf] avoid double memory usage in append opcodes --- packages/@glimmer/debug/lib/opcode-metadata.ts | 14 ++------------ packages/@glimmer/runtime/lib/opcodes.ts | 5 +++-- packages/@glimmer/util/index.ts | 2 +- packages/@glimmer/util/lib/object-utils.ts | 10 ---------- 4 files changed, 6 insertions(+), 25 deletions(-) diff --git a/packages/@glimmer/debug/lib/opcode-metadata.ts b/packages/@glimmer/debug/lib/opcode-metadata.ts index 29e5844bf9..c559bf57d3 100644 --- a/packages/@glimmer/debug/lib/opcode-metadata.ts +++ b/packages/@glimmer/debug/lib/opcode-metadata.ts @@ -5,16 +5,6 @@ import { MachineOp, Op } from '@glimmer/vm'; import type { NormalizedMetadata } from './metadata'; -function fillNulls(count: number): T[] { - let arr = new Array(count); - - for (let i = 0; i < count; i++) { - arr[i] = null; - } - - return arr; -} - export function opcodeMetadata( op: VmMachineOp | VmOp, isMachine: 0 | 1 @@ -24,8 +14,8 @@ export function opcodeMetadata( return value || null; } -const METADATA: Nullable[] = fillNulls(Op.Size); -const MACHINE_METADATA: Nullable[] = fillNulls(MachineOp.Size); +const METADATA: Nullable[] = new Array(Op.Size).fill(null); +const MACHINE_METADATA: Nullable[] = new Array(Op.Size).fill(null); MACHINE_METADATA[MachineOp.PushFrame] = { name: 'PushFrame', mnemonic: 'pushf', diff --git a/packages/@glimmer/runtime/lib/opcodes.ts b/packages/@glimmer/runtime/lib/opcodes.ts index 63bf3de582..3a9152e7e5 100644 --- a/packages/@glimmer/runtime/lib/opcodes.ts +++ b/packages/@glimmer/runtime/lib/opcodes.ts @@ -10,7 +10,7 @@ import type { import { debug, logOpcode, opcodeMetadata, recordStackSize } from '@glimmer/debug'; import { LOCAL_DEBUG, LOCAL_SHOULD_LOG } from '@glimmer/local-debug-flags'; import { valueForRef } from '@glimmer/reference'; -import { assert, fillNulls, LOCAL_LOGGER, unwrap } from '@glimmer/util'; +import { assert, LOCAL_LOGGER, unwrap } from '@glimmer/util'; import { $fp, $pc, $ra, $sp, Op } from '@glimmer/vm'; import type { LowLevelVM, VM } from './vm'; @@ -51,8 +51,9 @@ export type DebugState = { state: unknown; }; +const OPCODES_PLACEHOLDER = new Array(Op.Size).fill(null); export class AppendOpcodes { - private evaluateOpcode: Evaluate[] = fillNulls(Op.Size).slice(); + private evaluateOpcode: Evaluate[] = OPCODES_PLACEHOLDER.slice(); add(name: Name, evaluate: Syscall): void; add(name: Name, evaluate: MachineOpcode, kind: 'machine'): void; diff --git a/packages/@glimmer/util/index.ts b/packages/@glimmer/util/index.ts index 38c7af3b9c..df4c6eb773 100644 --- a/packages/@glimmer/util/index.ts +++ b/packages/@glimmer/util/index.ts @@ -11,7 +11,7 @@ export { isSerializationFirstNode, SERIALIZATION_FIRST_NODE_STRING, } from './lib/is-serialization-first-node'; -export { assign, entries, fillNulls, values } from './lib/object-utils'; +export { assign, entries, values } from './lib/object-utils'; export * from './lib/platform-utils'; export * from './lib/present'; export { diff --git a/packages/@glimmer/util/lib/object-utils.ts b/packages/@glimmer/util/lib/object-utils.ts index 3a1bc08b12..dcf40d6150 100644 --- a/packages/@glimmer/util/lib/object-utils.ts +++ b/packages/@glimmer/util/lib/object-utils.ts @@ -1,15 +1,5 @@ export let assign = Object.assign; -export function fillNulls(count: number): T[] { - let arr = new Array(count); - - for (let i = 0; i < count; i++) { - arr[i] = null; - } - - return arr; -} - export function values(obj: { [s: string]: T }): T[] { return Object.values(obj); }