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

StackOverflow https://stackoverflow.com/questions/4525587

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top