Мне нужна высокая производительность. Будет ли разница, если я использую C или C ++? - PullRequest
18 голосов
/ 17 ноября 2009

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

Будет ли разница, если я напишу это в коде в стиле C (один основной и функции) или создайте класс Solver, создайте экземпляр и вызовите метод run из основного (аналог Java)

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

Спасибо!

Ответы [ 14 ]

1 голос
/ 17 ноября 2009

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

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

0 голосов
/ 18 ноября 2009

Я занимаюсь некоторым DSP-кодированием, когда иногда приходится переходить на ассемблер. Я бы сказал, используйте C или C ++, либо один, и будьте готовы перейти на ассемблер, когда вам нужно, особенно для использования инструкций SIMD.

0 голосов
/ 18 ноября 2009

Я бы определенно пошел с C ++. Если вы внимательно относитесь к своему дизайну и избегаете создания тяжелых объектов внутри горячих точек, вы не должны видеть никаких различий в производительности, но код будет намного проще для понимания, обслуживания и расширения.

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

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

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

надеюсь, что поможет

0 голосов
/ 17 ноября 2009

Хорошие ответы. Я бы сказал так:

  1. Сделать алгоритм максимально эффективным с точки зрения его формальной структуры.

  2. C ++ будет работать так же быстро, как C, , за исключением , что соблазнит вас делать глупости, например, создавать объекты, которые вам не нужны, так что не принимайте приманку. Такие вещи, как классы контейнеров STL и итераторы, могут выглядеть как последние и лучшие вещи, но они убьют вас в горячей точке.

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

Вот как вы можете сделать это как можно быстрее.

...