- mówi doktor Guava

https://guava.dev/releases/16.0/api/docs/com/google/common/cache/CacheBuilder.html#initialCapacity(int)

Ustawia minimalny całkowity rozmiar dla wewnętrznych tabel skrótów. Na przykład, jeśli początkowa pojemność wynosi 60, a poziom współbieżności wynosi 8, tworzonych jest osiem segmentów, z których każdy ma tabelę skrótów o rozmiarze osiem. Zapewnienie dostatecznie dużego oszacowania w czasie budowy pozwala uniknąć późniejszych kosztownych operacji zmiany rozmiaru, ale ustawienie tej wartości niepotrzebnie powoduje marnotrawstwo pamięci.

Więc jaki jest sens używania initialCapacity, jeśli mamy zamiar utworzyć 8 tabel z 8 wierszami? Czy to jakiś błąd w dokumentacji?

0
ha9u63ar 20 listopad 2019, 17:24
1
Czy przegapiłeś jeśli początkowa pojemność to 60? Zmiana poziomu współbieżności i pojemności początkowej wpłynie na wydajność (i użycie pamięci). Celem korzystania z initialCapacity jest uniknięcie zmiany rozmiaru podczas umieszczania tam rzeczy.
 – 
Kayaman
20 listopad 2019, 17:27
Nie przegapiłem tego - myślę, że 8x8 nie staje się magicznie 60. Właśnie tego MikeFHay wyjaśnił w swojej odpowiedzi, czego brakowało w dokumentacji.
 – 
ha9u63ar
21 listopad 2019, 13:37

1 odpowiedź

Pod maską pamięć podręczna Guavy jest zaimplementowana jako wiele tablic haszujących, każda z dedykowaną blokadą, więc współbieżne zapisy nie wszystkie rywalizują na pojedynczej blokadzie.

initialCapacity odnosi się do pojemności całej pamięci podręcznej, a nie poszczególnych tabel bazowych. 8 tabel każdy o rozmiarze 8 może pomieścić razem do 64 elementów, więc dokumentacja jest poprawna.

1
MikeFHay 20 listopad 2019, 17:33
8x8=64, a nie 60. Myślę, że chodzi mi o to, że dokumentacja nie jest jasna. To może być poprawne. Dzięki za odpowiedź.
 – 
ha9u63ar
21 listopad 2019, 13:35