Lepsza tablica referencji czy tablica indeksow?

0

Jak w temacie. Powiedzmy, że chcę operować na zbiorze pewnych obiektów, ktory mam zgromadzony w głównej tablicy. Dodatkowo potrzebuję pomocniczej tablicy (tablic), która przechowuje pewien podzbiór elementów z głównej tablicy. Czy korzystniej jest w tablicy pomocniczej korzystać z referencji, czy z indeksów? Mam komputer 64 bitowy, więc, jak wywnioskowałem z któregoś ze wcześniejszych tematów, referencja ma na moim komputerze 8 bajtów, indeks, natomiast, który jest typu int, będzie zajmował 4 bajty, zatem teoretycznie tablica przechowująca indeksy byłaby dwukrotnie mniejsza. Z drugiej jednak strony, podejście takie wymaga komplikacji zapisu operacji przeprowadzanych na tej tablicy, bo za każdym razem trzeba odnosić się do tablicy głównej, by pobrać właściwy obiekt (a dodatkowe odniesienie się od tablicy i pobranie z niej elementu wymaga zapewne dodatkowych cykli procesora).

0

O tym jakiej wielkości będzie referencja decyduje nie tyle jakiego typu komputer używasz, ile jakiej wielkości słowem maszynowym operuje procesor. Jeżeli chodzi o wykorzystanie pamięci, to lepsze jest oczywiście wykorzystanie indeksów. W przypadku gdyby maksymalna ilość elementów głównej tablicy nie przekraczała 65536 sztuk, to można użyć nawet indeksu 16-bitowego, co oznacza użycie zmiennej typu short. Będzie to mieć znaczenie gdy program będzie masowo używać lub przechowywać duże ilości samych indeksów. Jednym z takich zastosowań mogłoby być przetwarzanie tekstów. Wszystko będzie tłumaczona na bytecode, co oznacza, że program będzie się lepiej skalować na małe urządzenia - szczególnie posiadające sprzętowe JVM. Z drugiej strony w urządzaniach z małą ilością pamięci również referencje są krótkie - często 16-bitowe, co niweluje zysk z użycia indeksów.
Jeżeli chodzi o szybkość przetwarzania, to ponieważ współczesne pamięci są 64-bitowe słowo maszynowe qword odczytywane jest tak samo szybko jak pojedynczy bajt ponieważ całe 8 bajtów jest odczytywane równolegle. Wolniej odczytują się tylko dane przecinające granicę kolejnych słów ponieważ procesor musi wykonać dwie operacje odczytu słowa maszynowego. Z tego powodu kompilatory rozkładają dane z wyrównaniem do długości słowa maszynowego.

Twój problem więc, to wybór między wolniej, ale z mniejszym zużyciem pamięci lub szybciej z większym.
W obecnie robionych dużych komputerach obowiązująca tendencja polega na olewaniu dłuższego czasu dostępu w zamian zyskując szybszy transfer. Przemawiałoby to więc na korzyść używania bezpośrednich referencji z jednokrotnym odczytem/zapisem zamiast dwóch takich operacji na mniejszych danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0