Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e57affa

Browse files
authored
Performance improvements (#745)
* Use dictionary lookups in Snapshot.Load instead of repeated linear searches * Use dictionary lookups in UpdateResourceTableEntries instead of repeated linear searches
1 parent 16615f7 commit e57affa

2 files changed

Lines changed: 23 additions & 6 deletions

File tree

src/ResXManager.Model/ResourceEntity.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,22 @@ public bool Update(ProjectFile file, [NotNullWhen(true)] out ResourceLanguage? u
8282

8383
private void UpdateResourceTableEntries()
8484
{
85-
var unmatchedTableEntries = _resourceTableEntries.ToList();
85+
var entriesByKey = _resourceTableEntries.ToDictionary(entry => entry.Key);
8686

8787
var keys = _languages.Values
8888
.SelectMany(language => language.ResourceKeys)
8989
.Distinct()
9090
.ToArray();
9191

92+
var matchedKeys = new HashSet<string>();
9293
var index = 0;
9394

9495
foreach (var key in keys)
9596
{
96-
var existingEntry = _resourceTableEntries.FirstOrDefault(entry => entry.Key == key);
97-
if (existingEntry != null)
97+
if (entriesByKey.TryGetValue(key, out var existingEntry))
9898
{
9999
existingEntry.Update(index);
100-
unmatchedTableEntries.Remove(existingEntry);
100+
matchedKeys.Add(key);
101101
}
102102
else
103103
{
@@ -107,6 +107,9 @@ private void UpdateResourceTableEntries()
107107
index += 1;
108108
}
109109

110+
var unmatchedTableEntries = _resourceTableEntries
111+
.Where(entry => !matchedKeys.Contains(entry.Key))
112+
.ToList();
110113
_resourceTableEntries.RemoveRange(unmatchedTableEntries);
111114
}
112115

src/ResXManager.Model/Snapshot.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,27 @@ private static void UnloadSnapshot(IEnumerable<ResourceEntity> resourceEntities)
5656

5757
private static void Load(this IEnumerable<ResourceEntity> resourceEntities, IEnumerable<EntitySnapshot> entitySnapshots)
5858
{
59+
var entitySnapshotMap = entitySnapshots
60+
.GroupBy(snapshot => (snapshot.ProjectName?.ToUpperInvariant(), snapshot.UniqueName?.ToUpperInvariant()))
61+
.ToDictionary(g => g.Key, g => g.First());
62+
5963
resourceEntities.ForEach(entity =>
6064
{
61-
var entrySnapshots = entitySnapshots.Where(snapshot => Equals(entity, snapshot)).Select(s => s.Entries).FirstOrDefault() ?? Array.Empty<EntrySnapshot>();
65+
var entityKey = (entity.ProjectName?.ToUpperInvariant(), entity.UniqueName?.ToUpperInvariant());
66+
var entrySnapshots = entitySnapshotMap.TryGetValue(entityKey, out var entitySnapshot)
67+
? entitySnapshot.Entries ?? Array.Empty<EntrySnapshot>()
68+
: Array.Empty<EntrySnapshot>();
69+
70+
var entrySnapshotMap = entrySnapshots
71+
.Where(s => s.Key != null)
72+
.GroupBy(s => s.Key ?? string.Empty, StringComparer.Ordinal)
73+
.ToDictionary(g => g.Key, g => g.First().Data ?? Array.Empty<DataSnapshot>(), StringComparer.Ordinal);
6274

6375
entity.Entries.ForEach(entry =>
6476
{
65-
var data = entrySnapshots.Where(s => string.Equals(entry.Key, s.Key, StringComparison.Ordinal)).Select(s => s.Data).FirstOrDefault() ?? Array.Empty<DataSnapshot>();
77+
var data = entrySnapshotMap.TryGetValue(entry.Key, out var snapData)
78+
? snapData
79+
: Array.Empty<DataSnapshot>();
6680

6781
entry.Snapshot = data.ToDictionary(item => new CultureKey(item.Language), item => new ResourceData { Text = item.Text, Comment = item.Comment });
6882
});

0 commit comments

Comments
 (0)