Затраты на использование классов для матрицы алгебраических структур в C++

Я использую C++ для кодирования какого-то сложного алгоритма FFT, поэтому мне нужно реализовать такие алгебраические структуры, как кватернионы и коды Гамильтона-Эйзенштейна. Алгоритм работает с 2D массивом этих структур. Каковы будут затраты на их реализацию в виде классов? Иначе, я должен создать массив с измерениями [M][N], который состоит из классов Quaternion, или я должен создать массив [M][N][4] и работать с [4] массивами как кватернионами? Использование классов более удобно, но создание классов M*N и доступ к их методам вместо работы только с массивом - не будет ли это слишком большой нагрузкой? Я кодирую алгоритм обработки больших изображений, поэтому для меня важна производительность.

2 ответа

Решение

ИМХО, вы лучше обслуживаете их как классы просто потому, что это позволит вам писать код быстрее и с меньшим количеством ошибок. Вы должны сделать измерения, чтобы увидеть, что работает лучше всего, если это важно для вас, но также убедитесь, что именно этот код является узким местом производительности. (Обязательная цитата Дональда Кнута: "преждевременная оптимизация - корень всего зла").

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

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

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

Что касается накладных расходов на классы: если у ваших классов нет виртуальных функций, штраф за использование классов не взимается.

Так, например, массив сложных переменных может быть записан как:

std::complex<double> m[10][10];

Остерегайтесь классов коллекции STL, так как они, как правило, используют динамическое распределение и иногда вносят значительные издержки (то есть я бы не создавал массивы, используя vector< vector<> >,

Возможно, вы захотите исследовать использование библиотеки, такой как Eigen, для быстрых, оптимизированных, матричных / векторных классов.

Другие вопросы по тегам