From 28844c59cf6de1c79cd48b1df3043d01f4cb1b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ran=20W?= <44604769+goran-w@users.noreply.github.com> Date: Fri, 13 Jun 2025 13:23:20 +0200 Subject: [PATCH] perf: optimize the `WorkingCopy.IsChanged()` method (#1418) * There's no need to populate a Dictionary just to diff the the "old" and "cur" Lists of Changes. * If the two lists are of equal length and no change has occurred, we can assume that they are also reported in equal sort-order (by git-status). * Thus, we only need to compare the two items at each successive index. --- src/ViewModels/WorkingCopy.cs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/ViewModels/WorkingCopy.cs b/src/ViewModels/WorkingCopy.cs index b7dee5c9..09ebc6f6 100644 --- a/src/ViewModels/WorkingCopy.cs +++ b/src/ViewModels/WorkingCopy.cs @@ -1778,16 +1778,11 @@ namespace SourceGit.ViewModels if (old.Count != cur.Count) return true; - var oldMap = new Dictionary(); - foreach (var c in old) - oldMap.Add(c.Path, c); - - foreach (var c in cur) + for (int idx = 0; idx < old.Count; idx++) { - if (!oldMap.TryGetValue(c.Path, out var o)) - return true; - - if (o.Index != c.Index || o.WorkTree != c.WorkTree) + var o = old[idx]; + var c = cur[idx]; + if (o.Path != c.Path || o.Index != c.Index || o.WorkTree != c.WorkTree) return true; }