From dd106ae9b85aaf434ab98eb873586fcffd093f0a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:43:31 -0700 Subject: [PATCH] Speed up clearing all markers, mass event listener dispose Part of microsoft/vscode#213174 --- src/common/EventEmitter.ts | 17 ++++++----------- src/common/buffer/Buffer.ts | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/common/EventEmitter.ts b/src/common/EventEmitter.ts index 589748a3..06ddf7fb 100644 --- a/src/common/EventEmitter.ts +++ b/src/common/EventEmitter.ts @@ -20,23 +20,18 @@ export interface IEventEmitter { } export class EventEmitter implements IEventEmitter { - private _listeners: IListener[] = []; + private _listeners: Set> = new Set(); private _event?: IEvent; private _disposed: boolean = false; public get event(): IEvent { if (!this._event) { this._event = (listener: (arg1: T, arg2: U) => any) => { - this._listeners.push(listener); + this._listeners.add(listener); const disposable = { dispose: () => { if (!this._disposed) { - for (let i = 0; i < this._listeners.length; i++) { - if (this._listeners[i] === listener) { - this._listeners.splice(i, 1); - return; - } - } + this._listeners.delete(listener); } } }; @@ -48,8 +43,8 @@ export class EventEmitter implements IEventEmitter { public fire(arg1: T, arg2: U): void { const queue: IListener[] = []; - for (let i = 0; i < this._listeners.length; i++) { - queue.push(this._listeners[i]); + for (const l of this._listeners.values()) { + queue.push(l); } for (let i = 0; i < queue.length; i++) { queue[i].call(undefined, arg1, arg2); @@ -63,7 +58,7 @@ export class EventEmitter implements IEventEmitter { public clearListeners(): void { if (this._listeners) { - this._listeners.length = 0; + this._listeners.clear(); } } } diff --git a/src/common/buffer/Buffer.ts b/src/common/buffer/Buffer.ts index 250c96bc..1d2922e8 100644 --- a/src/common/buffer/Buffer.ts +++ b/src/common/buffer/Buffer.ts @@ -611,8 +611,8 @@ export class Buffer implements IBuffer { this._isClearing = true; for (let i = 0; i < this.markers.length; i++) { this.markers[i].dispose(); - this.markers.splice(i--, 1); } + this.markers.length = 0; this._isClearing = false; }