Использование C ++ для приложений, требующих высокой производительности?

0

Полезно ли использовать c++ для интенсивных вычислений, таких как миллионы циклов, миллионы элементов в массивах и т.д.?

Чтобы быть более конкретным, полезно ли использовать только функции C в программе c++ по соображениям производительности?

Будет ли это приложение работать медленнее, чем тот, который написан на C?

Как вы знаете, удобнее писать c++ (вам не нужно определять все, больше поддерживаемых библиотек, при необходимости вы можете использовать медленные, но функции сохранения работы).

Этот сайт: http://benchmarksgame.alioth.debian.org/u64q/c.php убежден, что C работает быстрее.

  • 2
    FalalalalaFortran!
  • 2
    "Является ли хорошей идеей использовать только функции C в программе C ++ по соображениям производительности?" Нет, это плохая идея. Почему? Потому что вы, вероятно, увидите очень небольшую разницу в производительности. Если вы не пишете плохой C или C ++. Но тогда это твоя вина, а не язык.
Показать ещё 21 комментарий
Теги:
performance

4 ответа

1

Использование C++ для высокопроизводительного кода - неплохая идея. Ваш основной подход к производительности должен выбирать эффективные структуры данных и алгоритмы, поддерживаемые хорошим инструментом профилирования производительности, чтобы находить неожиданные горячие точки и анализировать поведение вашего кода.

  • 1
    +1 за упоминание инструментов профилирования.
0

C действительно отлично подходит для очень требовательных вычислений. Тем не менее, я не уверен, что вы увидите большую разницу по сравнению с C++. Если у вас проблемы с производительностью, вы должны в основном сосредоточиться на поиске быстрых алгоритмов вместо попыток оптимизации на уровне низкого уровня. Компиляторы могут делать гораздо лучше, чем вы. В частности, для этой проблемы SPOJ наивный алгоритм истекает даже для хорошо написанного, высоко оптимизированного кода. "Умный" алгоритм (даже плохо написанный) по меньшей мере в 10 раз быстрее.

Кроме того, вы можете попытаться проверить, можно ли параллельно выполнять вычисления. Затем вы можете попробовать использовать GPGPU с:

  1. CUDA
  2. OpenCL
  3. Вычислительные шейдеры OpenGL

В этих случаях C и C++ являются обязательными.

0

В общем, программа C++, написанная для производительности, будет по крайней мере такой же хорошей, как и аналогичная C-программа. Это может быть лучше, поскольку шаблоны облегчают повторное использование кода с большей оптимизацией времени компиляции (встраивание, удаление мертвого кода и т.д.), Чем C-эквиваленты, такие как qsort и bsearch. Библиотеки C++ предлагают такие вещи, как std::unordered_map и std::sort что упрощает работу программ C++ с использованием эффективных структур данных и алгоритмов, тогда как программы C чаще всего могут использовать массивы и алгоритмы грубой силы.

Если программа C++ использует библиотеки с более высокими накладными расходами или структурирована по-разному (например, используя OO и много виртуальной диспетчеризации), возможно, программа C++ может оказаться медленнее. Исторически сложилось так, что многие люди сообщили, что потоки ввода/вывода C++ значительно медленнее, чем альтернативы C-библиотеки, но они делают немного больше с точки зрения мест чести и поддерживают некоторое состояние, а современные реализации могут быть более быстрыми для некоторых операций.

Для операций с примитивными типами, циклов, вызовов функций и т.д., Не связанных с сложными библиотеками, обычно не будет разницы в производительности.

0

Ответ на этот вопрос имеет разные ответы. Рассмотрим следующие случаи.

-Loops не сильно зависит от языка программирования, он больше зависит от процессора. CPU имеет предсказание цикла, чтобы сделать цикл быстрее.

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

  • 1
    Использование классов по своей сути не требует виртуальной отправки. Только виртуальные функции требуют этого.
  • 0
    Классы не всегда используют виртуальную диспетчеризацию. И если они это сделают, то в любом случае вам придется делать то же самое в C, более или менее (если вы не решите по-разному проектировать программу, в таком случае, почему бы не по-другому это сделать и в C ++?).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню