Подтвердить что ты не робот

Языки быстрее, чем С++

Говорят, что Blitz ++ обеспечивает производительность около Fortran.

Действительно ли Fortran работает быстрее обычного С++ для эквивалентных задач?

Как насчет других языков HL с исключительной производительностью? Я слышал о нескольких языках, превосходящих С++ для определенных задач... Objective Caml, Java, D...

Я думаю, GC может сделать код намного быстрее, потому что он устраняет необходимость чрезмерного копирования вокруг стека? (предполагая, что код не написан для производительности)

Я прошу из любопытства - я всегда предполагал, что С++ - это довольно многообещающее кодирование ASM с запретом.

4b9b3361

Ответ 1

Fortran быстрее и почти всегда лучше, чем С++ для чисто числового кода. Существует много причин, по которым Fortran работает быстрее. Это старейший скомпилированный язык (много знаний в оптимизации компиляторов). Он по-прежнему является языком для численных вычислений, поэтому многие производители компиляторов зарабатывают на жизнь продажей оптимизированных компиляторов. Существуют и другие, более технические причины. Fortran (ну, по крайней мере, Fortran77) не имеет указателей и, следовательно, не имеет проблем с псевдонимом, которые накладывают языки C/С++ в этом домене. Многие высокопроизводительные библиотеки по-прежнему кодируются в Fortran с длинной ( > 30 лет) историей. Ни C, ни С++ не имеют хороших конструкций массивов (C слишком низкий уровень, С++ имеет столько библиотек массивов, что и компиляторы на планете, которые несовместимы друг с другом, что предотвращает пул хорошо протестированного быстрого кода).

Ответ 2

Является ли fortran быстрее, чем С++, является предметом обсуждения. Некоторые говорят "да", некоторые говорят "нет"; Я не буду вникать в это. Это зависит от компилятора, архитектуры, в которой вы его используете, реализации алгоритма... и т.д.

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

  • Индексирование массива на основе 1 (чрезвычайно полезно при реализации более крупных моделей, и вам не нужно об этом думать, а просто FORmula TRANslate
  • имеет степенной оператор (**) (Бог, чья идея заключалась в том, что будет выполняться функция мощности вместо оператора?!)
  • у него есть, я бы сказал, лучшая поддержка для многомерных массивов всех языков на текущем рынке (и, похоже, это не так скоро изменится) - A(1,2) точно так же, как в математике
  • не говоря уже об исключении циклов - A = B * C умножает массивы (почти как синтаксис Matlab со скомпилированной скоростью)
  • у него есть parallelism функции, встроенные в язык (проверьте новый стандарт на этом)
  • очень легко соединяется с такими языками, как C, python, поэтому вы можете делать свои сверхмощные вычисления в fortran, в то время как... что угодно... на выбранном вами языке, если вы так наклонены
  • полностью обратная совместимость (так как целая F77 является подмножеством F90), так что у вас есть целый век кодирования в вашем распоряжении.
  • очень очень портативный (это может не сработать для некоторых расширений компилятора, но в целом это работает как шарм)
  • сообщество, ориентированное на решение проблем (поскольку пользователи fortran обычно не являются cs, но математики, phy, инженеры... люди, не имеющие программирования, а скорее опыт решения проблем, чьи знания о вашей проблеме могут быть очень полезными)

Не могу думать о чем-то еще с моей головы прямо сейчас, так что это нужно будет сделать.

Ответ 3

Что Blitz ++ конкурирует против, это не столько язык Fortran, сколько человеко-столетия работы в библиотеках Fortran. В какой-то степени язык помогает: у более старого языка было намного больше времени, чтобы получить оптимизацию компиляторов (и, поверьте, С++ - один из самых сложных языков). С другой стороны, высокоуровневые библиотеки С++, такие как Blitz ++ и uBLAS позволяет более четко заявить о своих намерениях, чем относительно низкоуровневый код Fortran, и позволяет использовать все новые классы оптимизации времени компиляции.

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

Ответ 4

FORTAN, как правило, быстрее, чем С++ для обработки массивов из-за разных способов реализации языков массивами - FORTRAN не позволяет сглаживать элементы массива, тогда как С++. Это облегчает работу компиляторов FORTRAN. Кроме того, FORTRAN имеет много очень зрелых математических библиотек, над которыми работали почти 50 лет - С++ не было так долго!

Ответ 5

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

Если кто-то сказал, что fortran был немного быстрее, вы бы все-таки закодировали новый проект?

Ответ 6

вещь с С++ заключается в том, что она очень близка к аппаратным уровням. Фактически, вы можете программировать на аппаратном уровне (через монтажные блоки). В общем, компиляторы С++ довольно хорошо справляются с оптимизацией (для увеличения скорости, активируйте "Generation Time Time Generation", чтобы разрешить встраивание функций между различными файлами cpp), но если вы знаете аппаратное обеспечение и имеете ноу-хау, вы можете написать несколько функций в сборке, которые работают еще быстрее (хотя иногда вы просто не можете победить компилятор).

Вы также можете реализовать свои собственные менеджеры памяти (что не так много других языков высокого уровня), поэтому вы можете настроить их для своей конкретной задачи (возможно, большинство распределений будет составлять 32 байта или меньше, то вы можете просто иметь гигантский список 32-байтовых буферов, которые вы можете выделить/освободить в O (1) раз). Я считаю, что С++ CAN может испортить любой другой язык, если вы полностью понимаете компилятор и аппаратное обеспечение, которое используете. Большинство из них сводится к тем, какие алгоритмы вы используете больше всего.

Ответ 7

При загрузке этой страницы вы должны использовать некоторый нечетный управляемый XML-синтаксический анализатор.:)

Мы постоянно кодируем код и коэффициент усиления последовательно (и это не наивный С++, это просто современный С++ с boos). Он последовательно выполняет любую реализацию CLR, по крайней мере, 2x и часто на 5 или более раз. Чуть лучше, чем дни Java, когда он был примерно в 20 раз быстрее, но вы все равно можете найти хорошие экземпляры и просто устранить все раздувание System.Object и четко избить его до целлюлозы.

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

Два, удар приложения базы данных для любой производительности, да управляемый vs native db.

Ответ 8

Обычно это алгоритм, а не язык, определяющий рабочий стол производительности, в котором вы попадете.

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

Преждевременная оптимизация - корень всего зла

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

Ответ 10

Все зависит от компилятора, например, от сталинского компилятора Scheme, он превосходит почти все языки в наборе микро-тестов Debian, но упоминают ли они что-либо о времени компиляции?

Нет, я подозреваю (я раньше не использовал Сталина), компилируя для тестов (при всех оптимизациях при максимальных уровнях усилий) длительное время требуется для чего угодно, кроме самых маленьких фрагментов кода.

Ответ 11

Производительность скомпилированного языка - бесполезная концепция: что важно для качества компилятора, то есть какие оптимизации он может применить. Например, часто - но не всегда - компилятор Intel С++ производит более эффективный код, чем g++. Итак, как вы оцениваете производительность С++?

В какой языковой семантике возникает вопрос, насколько легко программисту получить компилятор для создания оптимального вывода. Например, часто проще распараллелить код Fortran, чем код C, поэтому Fortran по-прежнему широко используется для высокопроизводительных вычислений (например, для моделирования климата).


В качестве вопроса и некоторых ответов, упомянутых ассемблером: то же самое верно здесь, это просто еще один скомпилированный язык и, следовательно, не по своей сути "быстрее". Разница между ассемблером и другими языками заключается в том, что программист, который в идеале обладает абсолютным знанием о программе, несет ответственность за все оптимизации вместо делегирования некоторых из них компилятору 'dumb'.

Например, вызовы функций в ассемблере могут использовать регистры для передачи аргументов и не нужно создавать ненужные фреймы стека, но хороший компилятор также может это сделать (подумайте о inlining или fastcall). Недостатком использования ассемблера является то, что более эффективные алгоритмы сложнее реализовать (подумайте о линейном поиске и бинарном поиске, поиске в хэш-таблице,...).

Ответ 12

если код не написан для производительности, тогда С# быстрее, чем С++.

Необходимый отказ от ответственности: Все тесты являются злыми.

Здесь приведены тесты, которые в пользу С++.

Вышеуказанные две ссылки показывают, что мы можем найти случаи, когда С++ быстрее, чем С# и наоборот.

Ответ 13

С# намного быстрее, чем С++ - на С# я могу написать синтаксический анализатор XML и обработчик данных в десятый раз, когда мне понадобится написать С++.

О, вы имели в виду скорость выполнения?

Даже тогда, если вы берете время с первой строки кода, написанной до конца первого выполнения кода, С# все же, вероятно, быстрее, чем С++.

Это очень интересная статья о преобразовании С++-программы в С# и усилия, необходимые для ускорения работы С++, чем С#.

Итак, если вы учитываете скорость разработки, почти что-либо бьет С++.

ОК, чтобы удовлетворить только требования к производительности времени исполнения только для OP. Это не langauge, это реализация языка, который определяет производительность выполнения. Я мог бы написать компилятор С++, который производит самый медленный код, который можно вообразить, но он все еще С++. Теоретически возможно написать компилятор для Java, который нацелен на инструкции IA32, а не на байт-коды Java VM, что дает ускорение скорости выполнения.

Производительность вашего кода будет зависеть от соответствия между сильными сторонами языка и требованиями кода. Например, программа, которая делает много распределения/освобождения памяти, будет плохо работать в наивной программе на С++ (т.е. Использовать распределитель памяти по умолчанию), поскольку стратегия распределения памяти на С++ слишком обобщена, тогда как распределитель на основе С# GC может работать лучше (поскольку выше показаны ссылки). Манипуляции строк медленны на С++, но быстро в таких языках, как php, perl и т.д.

Ответ 14

D иногда может быть быстрее, чем С++ в практических приложениях, главным образом потому, что наличие сборки мусора помогает избежать накладных расходов RAII и подсчета ссылок при использовании интеллектуальных указателей. Для программ, которые выделяют большое количество мелких объектов с нетривиальными жизненными циклами, сбор мусора может быть быстрее, чем управление памятью в стиле С++. Кроме того, встроенные массивы D позволяют компилятору лучше выполнять оптимизацию в некоторых случаях, чем вектор С++ STL, который компилятор не понимает. Кроме того, D2 поддерживает неизменные данные и чистые аннотации функций, которые основаны на последних версиях DMD2. Уолтер Брайт, создатель D, написал интерпретатор JavaScript как в D, так и в С++, и, по его словам, версия D быстрее.

Ответ 15

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

Другим примером этого является то, как С# генерирует очень высокопроизводительный код просто потому, что компилятор знает, какие конкретные заклинания "означают", и умело использует реализацию, которая дает наивысшую производительность, когда транслитерация одной и той же программы на С++ приводит к ненужные циклы alloc/delete (скрытые шаблонами), потому что компилятор обрабатывает общий случай вместо конкретного случая, который предоставляет этот фрагмент кода.

Последний пример может быть в адаптациях Brook/Cuda C, предназначенных для экзотического оборудования, которое больше не так экзотично. Язык поддерживает точные примитивы (функции ядра), которые сопоставляются с оборудованием non von-neuman, скомпилированным для.

Ответ 16

Именно поэтому вы используете управляемый браузер? Потому что это быстрее. Или управляемая ОС, потому что она быстрее. Нет, держись, это база данных SQL. Подождите, это должна быть игра, в которую вы играете. Стоп, должен быть кусочек числового кода Java adn Csharp, откровенно бесполезный. BTW, вы должны проверить, что ваша VM написала для того, чтобы удалить корневой язык и сказать, что он медленный.

Что неправильно, но эй покажите мне быстрое управляемое приложение, чтобы мы все могли смеяться. VS? OpenOffice?

Ответ 17

Ahh... Хороший старый вопрос - какой компилятор делает более быстрый код?

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

  • (Подразумевается 1) Это имеет значение только в коде, который действительно видит компилятор. Если ваш счетчик программ тратит все свое время в сторонних библиотеках, которые вы не создаете, это не имеет значения.

  • В коде, где это имеет значение, все сводится к тому, что компилятор делает лучше ASM, и это в значительной степени зависит от того, насколько хорошо или глупо написано исходный код.

Со всеми этими переменными трудно отличить хороших компиляторов.

Однако, как было сказано, если у вас есть много кода Fortran для компиляции, не переписывайте его.