Если уж речь заходит о производительности и экономии памяти, не будет ли лучше использовать развернутый одномерный массив? Плюсы: минимальное потребление памяти, получение элемента за одно чтение из памяти.
Не знаю как в джаве (хотя если 32 бит, так как иначе-то), но в плюсах больше чем ана гигабайт-два выделить массив неполучится — фрагментация адресного пространства.
Особенность Винды? Сорри — реально не имел таких проблем на Линуксе.
Можно хоть террабайт выделить — и отработает. Вот когда начнете инициализировать и реально пойдет выделение страниц тогда будет своп…
Да, можно. Хотя потребление изменится уже несущественно, а код может стать значительно менее читаемым из-за вычисления смещений. Можно ещё написать простенький класс (или найти готовый), реализующий это для массивов произвольной размерности, хотя тогда будут накладные расходы на вызовы функций. В каждом конкретном случае рецепт свой. К примеру, изменения в производительности в моём случае будут эфемерны.
Отвечу на первую часть: вычисление смещений в минимальном варианте заворачиваются в final методы, которые на-ура будут заинлайнены любым компилятором. Аналогично с классом.
Если быть точным, заголовок объекта — это два машинных слова, соответственно, на 64-битной Java это будет уже не 8, а 16 байт.
Аналогично, заголовок массива — три машинных слова, на 64-битной Java — 24 байта.
Рекомендую также по теме вот эту презентацию. Один из разработчиков Twitter делится своим опытом в части модели памяти Java, сборки мусора и оптимизации.
Вообще-то проблема только в том что последний массив — это float[2]
Если бы там был float[100], то итоговый суммарный оверхед был бы не 350%, а доли процента.
Так что уточненная мораль сей истории состоит не в том, чтобы упорядочивать вложенные массивы по возрастанию, а в том, чтобы не создавать очень много очень мелких обьектов, когда есть возможность вместо этого создать обьектов не много, но крупных.
Размеры массивов в Java