2009-02-23 4 views
1

Например, если бы весь int [50] [8] использовал больше ресурсов (ОЗУ и ЦП), чем 8 полных int [50] массивов?У 2D-массивов больше ресурсов, чем 1D-массивов в Java?

+0

У вас есть образец кода, который мы можем проверить? – OscarRyz

+0

Что вы пытаетесь достичь? Если у вас проблемы с производительностью, это, вероятно, не связано с тем, как вы организуете свои массивы. – starblue

ответ

4

В первом случае у вас есть один объект массива, указывающий на пятьдесят объектов массива, содержащих 8 int. Итак, 1 + 50 объектов массива + пятьдесят указателей в первом объекте массива.

Во втором случае у вас есть один объект массива, указывающий на 8 объектов массива, содержащих 50 int. Итак, объекты 1 + 8 массива + восемь указателей в первом объекте массива. Удержание int - это стирка.

Невозможно оценить использование ЦП для этого.

+0

Итак, какой из них, если таковой имеется, лучше для CPU? Причина, по которой у меня возникают проблемы с процессором на Java, и единственное, о чем я могу думать, это массив. – William

+0

@William: попробуйте профилировщик, прежде чем пытаться оптимизировать массивы. Что вы делаете с массивами? –

1

Здесь может быть найдено несколько вещей.

  • new int[50][8]
  • new int[8][50]
  • new int[400]

Теперь я получаю это запутаться, но способ помнить, думать о new int[50][], который действителен.

So new int[50][8] представляет собой массив из 50 массивов размером 8 (51 объект). new int[8][50] - это массив из 8 массивов размером 50 (9 объектов). 9 объектов будут иметь меньшие накладные расходы, чем 51. new int[400] - это всего лишь один объект.

Однако при таком размере он, вероятно, не может измерить разницу в производительности вашей программы. Возможно, вы захотите инкапсулировать массив (ы) в объект, который позволит вам изменить реализацию и обеспечить более естественный интерфейс для кода клиента.

+0

вам не хватает 8 отдельных массивов для каждого из 50 объектов. это все о том, что есть что хранить 8 списков переменных, а не 50. – William

+0

Накладные расходы на наличие объекта будут более значительными, чем накладные расходы на ссылку на него, как в памяти, так и в ЦП. –

0

Вы можете настроить крошечный объем памяти с помощью массива int [] myInt = int [400] и вручную получить доступ к int в позиции (x, y) с помощью myInt [x + y * 50] , который сэкономит вам 50 32-битных фрагментов памяти. доступ к нему таким образом может быть (кто точно знает, что делает компилятор hotspot) ... возьмите еще одну инструкцию для умножения.

Такая микро-оптимизация, скорее всего, не заставит ваше приложение работать лучше, и это уменьшит читаемость.

+0

Я не эксперт в компиляторе Java, но это похоже на то, что компилятор, вероятно, сделает для вас в любом случае. Кто-нибудь знает, если это так? –

1

один пункт Useage (пришел из ссылки я, к сожалению, не могу сейчас найти, но достаточно здравого смысла) -

Авторы этой работы были тестирование различных способов сжатия разреженных массивов в mutidimensional массивы. Одна вещь, которую они заметили, что она делает разницу в скорости, которые, как вы итерацию -

Идея заключалась в том, что если у вас есть ИНТ [я] [J] он был быстрее сделать

for (i) { 
    for (j) 

чем

for (j) { 
    for (i) 

потому что в первом случае вы повторяете элементы, хранящиеся в соприкосновении.

+0

Да, правда даже для «реальных» многомерных массивов. –

0

Предлагаю написать небольшой тест производительности для этого с очень большими массивами, чтобы увидеть фактическую разницу.На самом деле я не думаю, что это будет иметь малейшее значение.

0

INT [50] [8] 50 массивов длины 8 Int [8] [50] имеет 8 массивы длиной 50 INT [400] является одним массивом 400. Каждый массив имеет накладных расходов около 16 байт.

Однако для размеров, которые у вас есть здесь, это действительно не имеет значения. Вы не собираетесь спасти многое в любом случае.