From 18c8c2b2cc88851edcba85ab2724e50738f5157f Mon Sep 17 00:00:00 2001 From: akade <16369295+akade@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:43:51 +0100 Subject: [PATCH] Optimize dictionary access with CollectionsMarshal.GetValueRefOrAddDefault within Trie and Lookup --- Akade.IndexedSet/DataStructures/Lookup.cs | 10 +++++----- Akade.IndexedSet/DataStructures/Trie.cs | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Akade.IndexedSet/DataStructures/Lookup.cs b/Akade.IndexedSet/DataStructures/Lookup.cs index b9648e1..e9a577f 100644 --- a/Akade.IndexedSet/DataStructures/Lookup.cs +++ b/Akade.IndexedSet/DataStructures/Lookup.cs @@ -1,4 +1,6 @@ -namespace Akade.IndexedSet.DataStructures; +using System.Runtime.InteropServices; + +namespace Akade.IndexedSet.DataStructures; /// /// Modifiable lookup based on with as value collection per key. @@ -11,10 +13,8 @@ internal class Lookup public bool Add(TKey key, TValue value) { - if (!_values.TryGetValue(key, out HashSet? keySet)) - { - keySet = _values[key] = []; - } + ref HashSet? keySet = ref CollectionsMarshal.GetValueRefOrAddDefault(_values, key, out _); + keySet ??= []; if (keySet.Add(value)) { diff --git a/Akade.IndexedSet/DataStructures/Trie.cs b/Akade.IndexedSet/DataStructures/Trie.cs index a98bd21..d98b10e 100644 --- a/Akade.IndexedSet/DataStructures/Trie.cs +++ b/Akade.IndexedSet/DataStructures/Trie.cs @@ -1,6 +1,7 @@ using Akade.IndexedSet.Extensions; using Akade.IndexedSet.Utils; using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; namespace Akade.IndexedSet.DataStructures; @@ -177,11 +178,10 @@ internal bool Add(ReadOnlySpan key, TElement element) else { _children ??= []; - if (!_children.TryGetValue(key[0], out TrieNode? trieNode)) - { - _children[key[0]] = trieNode = new(); - } + ref TrieNode? trieNode = ref CollectionsMarshal.GetValueRefOrAddDefault(_children, key[0], out _); + + trieNode ??= new(); return trieNode.Add(key[1..], element); } }