1

Я программирования что-то в Java, для контекста увидеть этот вопрос: Markov Model descision process in JavaЧто происходит быстрее: список массивов или объединение всех комбинаций данных?

У меня есть два варианта:

byte[MAX][4] mypatterns; 

или ArrayList mypatterns

я могу использовать Java ArrayList и присоединять новые массивы всякий раз, когда я их создаю, или использовать статический массив, вычисляя все возможные комбинации данных, затем прокручивая, чтобы увидеть, какие индексы «включены или выключены».

По существу, мне интересно, должен ли я выделить большой блок, который может содержать неинициализированные значения, или использовать динамический массив.

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

На основе теории и то, что я слышал, динамические массивы очень неэффективны

Мой вопрос: Будет ли цикл через массив, скажем, 200 элементов быстрее, чем добавление объекта в динамический массив?

Редактировать >>>

Дополнительная информация:

  • Я знаю MaxLength массива, если он статичен.
  • Элементы в массиве часто меняются, но их размеры постоянны, поэтому я могу их легко изменить.
  • Выделяя это статический будет подобие пула памяти
  • Других случаев могут иметь более или менее данных инициализируются, чем другие
+1

С помощью динамического массива вы ссылаетесь на 'List', например' ArrayList'? Какая теория и где вы слышали, что 'ArrayList' очень неэффективен по сравнению с простым массивом? Это не. – Andreas

+0

Да, и я просто редактировал его. – bigcodeszzer

+0

ArrayList может быть неэффективным. Я полагаю, но то, что я слышал, это статические массивы во много раз быстрее. Не уверен, что это правда, но это то, что я понимаю. – bigcodeszzer

ответ

1

Вы действительно на самом деле, я должен сначала использовать профилировщик, но мне также просто интересно узнать вопрос «в теории».

«Теория» слишком сложна.Существует слишком много альтернатив (различные способы реализации этого) для анализа. Кроме того, фактическая производительность для каждой альтернативы будет зависеть от аппаратного обеспечения, JIT-компилятора, размеров структуры данных и шаблонов доступа и обновления в вашем (реальном) приложении на (реальных) входах.

И есть вероятность, что это действительно неважно.

Короче говоря, никто не может дать вам ответ, который является обоснованным в теории. Лучшее, что мы можем дать это рекомендации, которые основаны на интуиции о производительности, и/или на основе разработки программного обеспечения здравого смысла:

  • проще код легче писать и поддерживать,

  • компилятор является более последовательный оптимизатор, чем человек,

  • Время, затрачиваемое на оптимизацию кода, который не нуждается в оптимизации, напрасно тратится впустую.


1 - Конечно, на большой код базы. Учитывая достаточное время и терпение, человек может лучше справляться с некоторыми проблемами, но это не является устойчивым в отношении большой кодовой базы, и в нем не учитываются факты, что 1) компиляторы всегда улучшаются, 2) оптимальный код может зависеть от вещей, которые человек не может принять во внимание, и 3) компилятор не устает и ошибается.

1

Любой разница в производительности не будет видна, когда вы установите initialCapacity на ArrayList , Вы говорите, что размер вашей коллекции никогда не изменится, но что, если эта логика изменится? Используя ArrayList, вы получаете доступ к множеству методов, таких как contains.

Как уже говорили другие люди, используйте ArrayList, если тесты производительности не говорят, что это бутылочная шее.

1

Самый быстрый способ перебора байтов - это как один массив. Более быстрый способ их обработки - int или long, поскольку процесс 4-8 байт за один раз быстрее, чем процесс по одному байту за раз, однако он скорее зависит от того, что вы делаете. Примечание: байт [4] на самом деле составляет 24 байта на 64-битной JVM, что означает, что вы не используете эффективный кеш процессора. Если вы не знаете точный размер, который вам нужен, вам может быть лучше создать буфер больше, чем вам нужно, даже если вы не используете весь буфер. то есть в случае байта [] [] вы используете в 6 раз больше памяти, в которой вы действительно нуждаетесь.

+0

Вы имеете в виду размер байта или количество байтов? Я думал, что выравнивание памяти произошло в кратных 8 в Java? – bigcodeszzer

+0

@bigcodeszzer Упорядочение по умолчанию для объектов - 8 байт. Однако, если вам нужна компактная и эффективная структура данных, вам нужен байт [] или аналогичный для всех данных, так что каждый байт использует только байт. –

+1

О, я вижу, я мог бы это сделать и пропустить с помощью i + = 4 или что-то в этом роде. – bigcodeszzer

Смежные вопросы