Co mogę zrobić w kodzie Java, aby zoptymalizować buforowanie procesora?

Czy pisząc program Java, mam wpływ na to, w jaki sposób CPU wykorzysta pamięć podręczną do przechowywania moich danych? Na przykład, jeśli mam tablicę, do której dostęp jest często uzyskiwany, czy pomaga, jeśli jest wystarczająco mała, aby zmieścić się w jednej linii pamięci podręcznej (zwykle 128 bajtów na komputerze 64-bitowym)? Co jeśli zachowam dużo używanego obiektu w tym limicie, czy mogę oczekiwać, że pamięć używana przez jego członków będzie blisko siebie i pozostanie w pamięci podręcznej?

Tło: Buduję skompresowanydrzewo cyfrowe, to jest mocno inspirowane przezTablice Judy, które są w C. Chociaż jestem głównie po technikach kompresji węzłów, Judy ma optymalizację pamięci podręcznej procesora jako główny cel projektu, a typy węzłów, jak również heurystyki przełączania między nimi są pod silnym wpływem. Zastanawiałem się, czy mam też szansę uzyskać te korzyści?

Edytować: Ogólna rada udzielonych odpowiedzi brzmi: nie próbuj mikrooptymalizować szczegółów na poziomie komputera, gdy jesteś tak daleko od maszyny, jak w Javie. Całkowicie się zgadzam, więc czułam, że muszę dodać kilka (miejmy nadzieję) wyjaśnień, by lepiej wyjaśnić, dlaczego uważam, że pytanie nadal ma sens. Poniżej:

Są pewne rzeczy, które są ogólnie łatwiejsze do obsługi przez komputery ze względu na sposób ich budowy. Widziałem kod Java uruchamiany zauważalnie szybciej na skompresowanych danych (z pamięci), mimo że dekompresja musiała wykorzystywać dodatkowe cykle procesora. Jeśli dane były przechowywane na dysku, oczywiste jest, dlaczego tak jest, ale oczywiście w pamięci RAM to ta sama zasada.

Teraz informatyka ma wiele do powiedzenia na temat tego, co to za rzeczy, na przykład, lokalność odniesienia jest świetna w C i myślę, że nadal jest świetna w Javie, może nawet bardziej, jeśli pomaga optymalizacji środowiska wykonawczego robić więcej sprytnych rzeczy. Ale jak to osiągnąć, może być zupełnie inaczej. W języku C mogę napisać kod, który sam zarządza większymi fragmentami pamięci i używa powiązanych wskaźników do powiązanych danych.

W Javie nie mogę (i nie chcę) wiedzieć dużo o tym, jak pamięć będzie zarządzana przez określone środowisko wykonawcze. Muszę więc również przeprowadzić optymalizację na wyższy poziom abstrakcji. Moje pytanie jest w zasadzie, jak mam to zrobić? Co do lokalności odniesienia, co oznacza „blisko siebie” na poziomie abstrakcji, nad którym pracuję w Javie? Ten sam obiekt? Taki sam typ? Ta sama tablica?

Ogólnie rzecz biorąc, nie sądzę, aby warstwy abstrakcji zmieniały „prawa fizyki”, mówiąc metaforycznie. Podwojenie rozmiaru tablicy za każdym razem, gdy zabraknie miejsca, jest również dobrą strategią w Javie, nawet jeśli nie dzwoniszmalloc() już.

questionAnswers(5)

yourAnswerToTheQuestion