Gdy próbuje go na hotspot (dokładne dane liczbowe mogą różnić się od tych, które można dostać na Dalvik, ale wnioski powinny być podobny), otrzymuję następujące wyniki:
tablicę Object (1000x2x2): 76034 bajtów
tablicy Object (2x2x1000): 16137 bajtów
jest to zgodne z przybliżonych obliczeń:
[2][2][1000]
Array # Header Size Memory Number Total
1 16 2 24 1 24
2 16 2 24 2 48
3 16 1000 4016 4 16,064
Grand Total 16,136
[1000][2][2]
Array # Header Size Memory Number Total
1 16 1000 4016 1 4,016
2 16 2 24 1000 24,000
3 16 2 24 2000 48,000
Grand Total 76,016
kod testowy poniżej, należy uruchomić z -XX:-UseTLAB
, aby uzyskać bardziej dokładne wyniki.
public class TestMemory {
private static final int SIZE = 100;
private static Runnable r;
private static Object o;
private static void test(Runnable r, String name, int numberOfObjects) {
long mem = Runtime.getRuntime().freeMemory();
r.run();
System.out.println(name + ": " + (mem - Runtime.getRuntime().freeMemory())/numberOfObjects + " bytes");
}
public static void main(String[] args) throws Exception {
r = new Runnable() { public void run() { for (int i = 0; i < SIZE; i++) o = new Object[1000][2][2];} };
test(r, "Object array (1000x2x2)", SIZE);
r = new Runnable() { public void run() { for (int i = 0; i < SIZE; i++) o = new Object[2][2][1000];} };
test(r, "Object array (2x2x1000)", SIZE);
}
}
Dziękujemy! Mam jedno pytanie. Być może najlepszym sposobem na zaoszczędzenie pamięci będzie Bitmap [] c = new Bitmap [2 * 1000] 'i późniejszy indeks obliczeniowy jak' 1000 * i + j'? Nie będzie różnicy prędkości w porównaniu do 'Bitmap [2] [1000]'? –
1) Tak ... ale to utrudnia odczytanie kodu, a przyrostowa oszczędność nie jest duża. 2) Tablica 1D * może * być szybsza, ponieważ jest mniej sprawdzeń granicznych i mniej pobrań. Różnica jest jednak najprawdopodobniej zbyt mała, aby spowodować jakiekolwiek różnice. –
Należy zauważyć, że na przykład w 64-bitowym hotspot odwołania są domyślnie kompresowane do 4 bajtów. – assylias