5 массивов или одна матрица?

Я работаю над проектом, в котором мне нужно хранить как можно быстрее следующее:

1 — Ускорение по оси X

2 — Ускорение по Y

3 — Ускорение по Z

4 – отметка времени

5 – значение другого датчика

Поскольку мне нужно получить их как можно быстрее, я думаю не выполнять никаких вычислений во время получения значений и просто хранить их в течение 30–60 секунд, а затем, когда «тест» будет завершен, выполнять вычисления. Мой вопрос в том, будет ли лучше создать 5 массивов и поместить туда эти значения или создать матрицу и хранить там значения. Мне нужно, чтобы эти значения хранились так, как будто они «подключены» например, при чтении 1 я получаю 5 значений и помещаю их в массив [0], затем при чтении 1 и т.д. Также важно отметить, что это будет работать на esp32.

Спасибо

, 👍0

Обсуждение

Время, необходимое для хранения этих значений в оперативной памяти, скорее всего, будет меньше времени, необходимого для считывания значений с датчиков., @Edgar Bonet

Спасибо большое, я думаю вы правы, @David


1 ответ


Лучший ответ:

3

Я полностью согласен с Эдгаром Боне.

По моему мнению, лучше хранить «матрицу» или фактически один массив (структур), где каждый элемент массива хранит всю информацию для одного измерения (которая хранится внутри одной структуры). Это имеет некоторые преимущества:

  • Данные одного измерения расположены в памяти последовательно, поэтому их можно легко перенести (во внешнюю память или отправить). Это ровно одна структура (и вы можете использовать sizeof(struct_item), чтобы узнать, сколько байтов вам нужно передать.

  • В целом рекомендуется хранить информацию вместе, создание 5 массивов всегда одинаковой длины кажется странным.

  • Если по какой-то причине вы хотите сделать один массив динамическим или изменить его, например, на кольцевой буфер, вы можете легко добавлять/удалять элементы (вместо динамического изменения 5 массивов).
  • Место изменения (см. комментарии Kwasmich/DuncanC)

Есть еще одно преимущество отдельных массивов (где каждый массив хранит один тип информации, например ускорение или метку времени: когда у вас есть функция (особенно в другом классе), которой нужен только один из них, вы можете специально отправить этот массив (или указатель/ссылка), поэтому другая информация скрыта от этой функции.

,

Вы правы, но теперь возникает другой вопрос: если я помещу все в один массив, тогда значение [x] должно содержать все - возможно, мне нужно как-то объединить их accX, accY... поэтому у меня будет массив строк, @David

Вы знаете, что между AoS и SoA (Arrays of Struct vs Structure of Arrays) ведутся религиозные споры. В основном речь идет о локальности данных, которая не применяется к MCU из-за отсутствия кешей., @Kwasmich

@David, идея состоит в том, чтобы создать массив структур, в который вы вводите значения., @Michel Keijzers

@Kwasmich Я не знал, что эти бои такие тяжелые/религиозные. Тем не менее, я могу кое-что упомянуть об этом в своем ответе (так что я собираюсь адаптировать)., @Michel Keijzers

Для современных ферм ЦП или ГП локальность ссылок может значительно улучшить согласованность кэша и, следовательно, значительно повысить скорость. Это предполагает наличие массива структур, в котором все значения для одного вычисления сгруппированы вместе. Однако, как говорит Квасмич, это не относится к микроконтроллерам, таким как Arduino., @Duncan C

@DuncanC Итак, еще одна (хорошая) причина иметь массив структур. С другой стороны, предположим, что вам нужно выполнить алгоритм для одного типа (скажем, временной метки), чем было бы наоборот, но в большинстве случаев я предполагаю, что информация одного измерения больше связана друг с другом, чем информация одного типа (ось , отметка времени)., @Michel Keijzers