Doskonałe pytanie!
Przede wszystkim odpowiedź @dasblinkenlight jest prawidłowa, powiedzmy, przez większość czasu. Zbudowanie klucza pojedynczego obiektu jest najbardziej prostym i oczywistym rozwiązaniem. Jest to łatwe i jasne do zrozumienia i dość wydajne. Jeśli ta pamięć podręczna nie jest punktem dostępowym twojej aplikacji, nie musisz już więcej myśleć.
Istnieją jednak alternatywy, które mogą zapewnić lepszą wydajność.
Konceptualnie istnieją dwie możliwości:
- skonstruować jeden kluczowy obiekt dla kluczy złożonych. To wspólny wzór i dość typowy, jeśli używasz kluczy złożonych do dostępu do bazy danych
- zrobić dwa lub wielo poziomie hierarchicznym odnośnika, np
store.get(month).get(time)
Dla hierarchicznej odnośnika, żaden dodatkowy przydział obiekt jest potrzebna, jednak zamienisz go na drugi dostęp do tablicy hash. Aby zachować maksymalną wydajność pamięci, ważne jest, aby najpierw umieścić klucz o najmniejszej przestrzeni wartości.
Jeśli to jest bardzo centralne miejsce swojego zastosowania, nawet lepszym rozwiązaniem jest umieszczenie pierwszego etapu przeglądową, dwanaście miesięcy, w tablicę i zainicjować go na starcie:
Cache<Time, Value>[] month2ValueCache = new Cache<Time, Value>[12];
{
for (int i = 0; i < 12; i++) {
month2ValueCache[i] = new Cache<Time, Value>(...);
}
}
Value get(int month, Time, time) {
return month2ValueCache[month].get(time);
}
zrobiłem Benchmark porównawczy do formatowania dat za pomocą DateFromatter. To szwy podobne do twojego przypadku użycia. Ma to właściwie trzy kluczowe składniki: datę, format i lokalizację. Znajdziesz go tutaj: https://github.com/headissue/cache2k-benchmark/blob/master/zoo/src/test/java/org/cache2k/benchmark/DateFormattingBenchmark.java
Mój wynik był taki, że w rzeczywistości nie ma dużej różnicy czasu pomiędzy przydzieleniem obiektu dla kluczy złożonych lub trzema poziomami wyszukiwania pamięci podręcznej bez przydzielania obiektów dla klucza. Jednak zastosowana struktura porównawcza nie uwzględnia poprawnie zbierania śmieci. Po przejściu na inne środowisko testowe dokonam bardziej dogłębnej oceny.
Czas i miesiąc .. mmhh, a co z łączeniem go z datą i tworzeniem klucza mapy? –
"Czy jest lepszy sposób na robienie tego" Co sądzisz o tym źle? –
Czy możesz podać przykład zastosowania (ń) klasy, którą chcesz zrobić, oraz wyjątków? (Właściwie to nie jestem pewien, aby zrozumieć, co chciałbyś zrobić.) – RyDroid