W moim bieżącym kodzie widzę wiele buforowanych identyfikatorów, takich jak:
val idMapping = MMap.empty[String, String]
idMapping.put("ID1234", "ID1234")
Jest to rzekomo zrobione jako skuteczny sposób buforowania tych unikalnych identyfikatorów w celu szybkiego wyszukiwania, takich jak -
idMapping.get("ID1234")
a jeśli zwróci zero, bla bla.
Czy jest na to lepsza alternatywa? Z łatwością przychodzi mi na myśl HashSet, ale w Scali znalazłem niewiele przykładów pamięci podręcznej opartych na HashSet?
Czy ktoś może zaproponować ulepszenia powyższego projektu?
Odpowiedzi:
1 dla odpowiedzi № 1Użyć Set
. Jeśli to naprawdę zawsze jest mapowanie tożsamości, a Map
jest całkowicie niepotrzebne. Zużywa więcej pamięci i może być wolniejszy, gdy używasz get
, z powodu stworzenia Option
wartość. Sprawdzam również if (alreadyProcessed(key))
po prostu wygląda ładniej niż if (alreadyProcessed.get(key).nonEmpty)
.
1 dla odpowiedzi nr 2
Najlepszą strukturą danych do buforowania jest WeakHashMap.
W twoim przykładzie:
val cache = new WeakHashMap[String, String]
/* … */
val value = cache.getOrElseUpdate(id, generate(id))
WeakHashMap nie chroni kluczy przedwyrzucanie elementów bezużytecznych, co oznacza, że wpisy zostaną automatycznie usunięte, gdy nie będą już używane i nastąpi pewne wyrzucanie elementów bezużytecznych. mutable.HashMap można zamiast tego użyć (getOrElseUpdate
jest również dostępna), jeśli pamięć nie stanowi problemu.