From 57f38531e99caa6b7514afcfc6e44714414320af Mon Sep 17 00:00:00 2001 From: Charles Teague Date: Mon, 3 Feb 2025 12:30:37 -0500 Subject: [PATCH 1/2] Use a workspace cache (of 500 entries) for the headers --- .../log-listing/log-listing-server-queue.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tools/vscode/src/providers/activity-bar/log-listing/log-listing-server-queue.ts b/tools/vscode/src/providers/activity-bar/log-listing/log-listing-server-queue.ts index 088c34392..91d6b826f 100644 --- a/tools/vscode/src/providers/activity-bar/log-listing/log-listing-server-queue.ts +++ b/tools/vscode/src/providers/activity-bar/log-listing/log-listing-server-queue.ts @@ -22,6 +22,13 @@ export class LogElementQueueProcessor { private readonly onElementUpdated: (element: LogNode) => void, private readonly batchSize: number = 10, ) { + // Load cache from workspace storage + const savedCache = this.context.workspaceState.get>('elementCache'); + if (savedCache) { + this.elementCache = new Map(savedCache); + } else { + this.elementCache = new Map(); + } } enqueueElement(element: LogNode): void { @@ -84,8 +91,9 @@ export class LogElementQueueProcessor { const evalLogs = JSON.parse(headers) as EvalLog[]; // Update elements with their corresponding evalLog - evalLogs.forEach((evalLog, index) => { - const uri = uris[index]; + for (let i = 0; i < evalLogs.length; i++) { + const evalLog = evalLogs[i]; + const uri = uris[i]; const element = elementUris.get(uri); if (element && evalLog?.version === 2) { // Populate the server provided props @@ -104,12 +112,16 @@ export class LogElementQueueProcessor { iconPath: element.iconPath, tooltip: element.tooltip }); + + // Persist the cache + await this.context.workspaceState.update('elementCache', Array.from(this.elementCache.entries())); + this.enforceCacheLimit(); } // Notify that the element was updated this.onElementUpdated(element); } - }); + } } } } catch (error) { @@ -131,6 +143,15 @@ export class LogElementQueueProcessor { this.elementCache.clear(); } + enforceCacheLimit(): void { + // Evict the least recently used item if this exceeds + // the max size + if (this.elementCache.size > 500) { + const keys = Array.from(this.elementCache.keys()); + this.elementCache.delete(keys[0]); + } + } + public cachedValue(uri: string): { iconPath?: string | vscode.ThemeIcon; tooltip?: vscode.MarkdownString; From e281c7d3552ee6839d6414d001e445260e45e00c Mon Sep 17 00:00:00 2001 From: Charles Teague Date: Mon, 3 Feb 2025 12:32:39 -0500 Subject: [PATCH 2/2] Update version/log --- tools/vscode/CHANGELOG.md | 4 ++++ tools/vscode/package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/vscode/CHANGELOG.md b/tools/vscode/CHANGELOG.md index 605dfaba9..30c08b3f6 100644 --- a/tools/vscode/CHANGELOG.md +++ b/tools/vscode/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.3.51 + +- Improve performance of log listing rendering by caching information in the workspace. + ## 0.3.50 - Use the integrated terminal when debugging tasks. diff --git a/tools/vscode/package.json b/tools/vscode/package.json index ec1c1e418..7ad40588a 100644 --- a/tools/vscode/package.json +++ b/tools/vscode/package.json @@ -7,7 +7,7 @@ "author": { "name": "UK AI Safety Institute" }, - "version": "0.3.50", + "version": "0.3.51", "license": "MIT", "homepage": "https://inspect.ai-safety-institute.org.uk/", "repository": {