Что быстрее: список массивов или циклический просмотр всех комбинаций данных?
Я программирую что-то на Java, для контекста смотри этот вопрос: Марковский процесс дескрипции модели в Java
У меня есть два варианта:
byte[MAX][4] mypatterns;
или ArrayList mypatterns
Я могу использовать Java ArrayList и добавлять новые массивы всякий раз, когда я их создаю, или использовать статический массив, вычисляя все возможные комбинации данных, а затем просматривая, какие индексы "включены или выключены".
По сути, мне интересно, должен ли я выделить большой блок, который может содержать неинициализированные значения, или использовать динамический массив.
Я работаю в fps, так что цикл по 200 элементам в каждом кадре может быть очень медленным, особенно потому, что у меня будет несколько экземпляров этого цикла.
Исходя из теории и того, что я слышал, динамические массивы очень неэффективны
Мой вопрос: будет ли цикл в массиве, скажем, 200 элементов быстрее, чем добавление объекта в динамический массив?
Редактировать >>>
Дополнительная информация:
- Я буду знать максимальную длину массива, если он статический.
- Элементы в массиве часто меняются, но их размеры постоянны, поэтому я легко могу их изменить.
- Распределение статически будет подобием пула памяти
- Другие экземпляры могут иметь больше или меньше инициализированных данных, чем другие
3 ответа
Вы действительно правы, я должен сначала использовать профилировщик, но мне также просто любопытен вопрос "в теории".
"Теория" слишком сложна. Существует слишком много альтернатив (различные способы реализации этого) для анализа. Кроме того, фактическая производительность для каждой альтернативы будет зависеть от аппаратного обеспечения, JIT-компилятора, размеров структуры данных, а также шаблонов доступа и обновления в вашем (реальном) приложении на (реальных) входах.
И есть вероятность, что это действительно не имеет значения.
Короче говоря, никто не может дать вам обоснованный в теории ответ. Лучшее, что мы можем дать - это рекомендации, основанные на интуиции в отношении производительности и / или основанные на здравом смысле разработки программного обеспечения:
более простой код легче писать и поддерживать,
компилятор более последовательный оптимизатор, чем человек,
время, потраченное на оптимизацию кода, который не нужно оптимизировать, является потраченным впустую.
1 - Конечно, над большой кодовой базой.При наличии достаточного количества времени и терпения человек может лучше справляться с некоторыми проблемами, но это не является устойчивым при большой кодовой базе и не учитывает фактов, что 1) компиляторы постоянно совершенствуются, 2) оптимальный код может зависеть от того, что человек не может принять во внимание, и 3) компилятор не устает и не делает ошибок.
Любая разница в производительности не будет видна, когда вы установите initialCapacity
на ArrayList
, Вы говорите, что размер вашей коллекции никогда не изменится, но что, если эта логика изменится? С помощью ArrayList
вы получаете доступ ко многим методам, таким как contains
,
Как уже говорили другие люди, используйте ArrayList
если тесты производительности не скажут, что это бутылочное горлышко.
Самый быстрый способ перебирать байты - использовать отдельные массивы. Более быстрый способ обработать это как int
или же long
Например, обрабатывать 4-8 байт за раз быстрее, чем обрабатывать один байт за раз, однако это скорее зависит от того, что вы делаете. Примечание: байт [4] на самом деле составляет 24 байта в 64-битной JVM, а это означает, что вы неэффективно используете свой кэш процессора. Если вы не знаете точный размер, который вам нужен, лучше создать буфер большего размера, чем нужно, даже если вы не используете весь буфер. т. е. в случае байта [][] вы используете в 6 раз больше памяти, чем вам действительно нужно.