@mlyamasov

Как лучше разместить в оперативной памяти массив комплексных чисел с точки зрения производительности?

В двух массивах: double re[N]; double im[N]; или в одном double c[2*N], где действительные и мнимые части чередуются?
Есть ли какая-нибудь разница с точки зрения производительности? Может, во втором случае лучше работает кэш процессора, т.к. действительная и мнимая части числа используются одновременно?
Мне удобнее в двух массивах.
P.S. Про структуры и читабельность я знаю.
Кроме того, мне помнится, что в некоторых популярных математических библиотеках действительные и мнимые части хранятся отдельно. Например, UMFPACK поддерживает оба варианта. Логика мне тоже подсказывает, что лучше использовать один массив, но я не уверен, хотелось бы каких-нибудь подтверждений, результатов тестов...
  • Вопрос задан
  • 573 просмотра
Пригласить эксперта
Ответы на вопрос 3
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Если вы хотите быть дружественными к кэшу, то нужна локальность доступа к данным.

Поэтому лучше в одном массиве чередовать реальную и мнимую части. Или, еще лучше - завести структуру с двумя полями и хранить массив из них. Тут в памяти расстановка данных будет такая же, но код будет читаем и логичен.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Удобнее использовать массив структур:
struct complex_t {
float re, im;
};

Смысл тот же, что и в c[2*N], но пользоваться удобнее и читабельность кода повышается.
Учтите, что операции над double обычно выполняются дольше, чем над float.
Ответ написан
Комментировать
Griboks
@Griboks
Есть ли какая-нибудь разница с точки зрения производительности?

Это зависит от алгоритма обработки. Если вы просто загружаете 2n случайных чисел в память, то это займет одинаковое количество времени.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы