From 42defaa7c30db39cb0c090561095bf2299011c01 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 07:48:17 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20[performance=20improvement]?= =?UTF-8?q?=20avoid=20string[]=20allocations=20in=20GetTaskSearchTokens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced `string.Split` with `ReadOnlySpan.SplitAny` in `GetTaskSearchTokens` methods (RootPaletteSearchIndex.cs and WorkspaceRepositorySnapshot.cs) to prevent array allocations and intermediate string creations on frequent searches. --- .../Services/RootPaletteSearchIndex.cs | 24 ++++++++++++------- .../Services/WorkspaceRepositorySnapshot.cs | 24 ++++++++++++------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/QuickShell.Core/Services/RootPaletteSearchIndex.cs b/QuickShell.Core/Services/RootPaletteSearchIndex.cs index 98f3fbe5..1d589ac6 100644 --- a/QuickShell.Core/Services/RootPaletteSearchIndex.cs +++ b/QuickShell.Core/Services/RootPaletteSearchIndex.cs @@ -285,6 +285,7 @@ private static int ScoreToken(string? value, string token, int exact, int prefix return value.Contains(token, StringComparison.OrdinalIgnoreCase) ? contains : 0; } + // Bolt: Performance optimization - avoid string[] allocations by using SplitAny over ReadOnlySpan private static string[] GetTaskSearchTokens(string? query) { if (string.IsNullOrWhiteSpace(query)) @@ -292,18 +293,23 @@ private static string[] GetTaskSearchTokens(string? query) return []; } - return query - .Split([' ', '\t', '\r', '\n'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) - .Select(NormalizeTaskSearchToken) - .Where(token => token.Length > 0 && !IsTaskSearchVerb(token)) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToArray(); + var tokens = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var range in query.AsSpan().SplitAny([' ', '\t', '\r', '\n'])) + { + var tokenSpan = NormalizeTaskSearchToken(query.AsSpan(range).Trim()); + if (tokenSpan.Length > 0 && !IsTaskSearchVerb(tokenSpan)) + { + tokens.Add(tokenSpan.ToString()); + } + } + + return tokens.ToArray(); } - private static string NormalizeTaskSearchToken(string token) => - token.Trim('\'', '"', '`', ',', '.', ':', ';', '(', ')', '[', ']', '{', '}'); + private static ReadOnlySpan NormalizeTaskSearchToken(ReadOnlySpan token) => + token.Trim("'\"`,.:;()[]{}".AsSpan()); - private static bool IsTaskSearchVerb(string token) => + private static bool IsTaskSearchVerb(ReadOnlySpan token) => token.Equals("run", StringComparison.OrdinalIgnoreCase) || token.Equals("open", StringComparison.OrdinalIgnoreCase) || token.Equals("start", StringComparison.OrdinalIgnoreCase) || diff --git a/QuickShell.Core/Services/WorkspaceRepositorySnapshot.cs b/QuickShell.Core/Services/WorkspaceRepositorySnapshot.cs index 8e85758d..40517cd6 100644 --- a/QuickShell.Core/Services/WorkspaceRepositorySnapshot.cs +++ b/QuickShell.Core/Services/WorkspaceRepositorySnapshot.cs @@ -288,6 +288,7 @@ private static int ScoreToken(string? value, string token, int exact, int prefix return trimmed.Contains(token, StringComparison.OrdinalIgnoreCase) ? contains : 0; } + // Bolt: Performance optimization - avoid string[] allocations by using SplitAny over ReadOnlySpan private static string[] GetTaskSearchTokens(string? query) { if (string.IsNullOrWhiteSpace(query)) @@ -295,18 +296,23 @@ private static string[] GetTaskSearchTokens(string? query) return []; } - return query - .Split([' ', '\t', '\r', '\n'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) - .Select(NormalizeTaskSearchToken) - .Where(token => token.Length > 0 && !IsTaskSearchVerb(token)) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToArray(); + var tokens = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var range in query.AsSpan().SplitAny([' ', '\t', '\r', '\n'])) + { + var tokenSpan = NormalizeTaskSearchToken(query.AsSpan(range).Trim()); + if (tokenSpan.Length > 0 && !IsTaskSearchVerb(tokenSpan)) + { + tokens.Add(tokenSpan.ToString()); + } + } + + return tokens.ToArray(); } - private static string NormalizeTaskSearchToken(string token) => - token.Trim('\'', '"', '`', ',', '.', ':', ';', '(', ')', '[', ']', '{', '}'); + private static ReadOnlySpan NormalizeTaskSearchToken(ReadOnlySpan token) => + token.Trim("'\"`,.:;()[]{}".AsSpan()); - private static bool IsTaskSearchVerb(string token) => + private static bool IsTaskSearchVerb(ReadOnlySpan token) => token.Equals("run", StringComparison.OrdinalIgnoreCase) || token.Equals("open", StringComparison.OrdinalIgnoreCase) || token.Equals("start", StringComparison.OrdinalIgnoreCase) ||