Fortran легче оптимизировать, чем C для тяжелых вычислений?

время от времени я читал, что Fortran является или может быть быстрее, чем C для тяжелых вычислений. Это правда? Должен признаться, что я едва знаю Фортран, но код Фортрана, который я видел до сих пор, не показал, что у языка есть черты, которых нет у C.

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

23 ответов


языки имеют схожие наборы. Разница в производительности происходит от того, что Fortran говорит, что сглаживание не допускается, если не используется оператор эквивалентности. Любой код с псевдонимами недопустим для Fortran, но обнаружение этих ошибок зависит от программиста, а не компилятора. Таким образом, компиляторы Fortran игнорируют возможное сглаживание указателей памяти и позволяют им генерировать более эффективный код. Взгляните на этот пример в C:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

этот функция будет работать медленнее, чем аналог Fortran после оптимизации. Почему? Если вы записываете значения в выходной массив, вы можете изменить значения матрицы. В конце концов, указатели могут перекрываться и указывать на один и тот же кусок памяти (включая int указатель!). Компилятор C вынужден перезагрузить четыре значения матрицы из памяти для всех вычислений.

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

к счастью, ключевое слово restrict и строгое сглаживание были введены в стандарт C99 для решения этой проблемы. В наши дни он хорошо поддерживается в большинстве компиляторов C++. Ключевое слово позволяет дать компилятору подсказку, что программист обещает, что указатель не псевдоним с любым другим указателем. Строгое сглаживание означает, что программист обещает, что указатели разного типа никогда не будут перекрытие, например double* не будет перекрываться с int* (за исключением того, что char* и void* может перекрываться с чем угодно).

если вы используете их, вы получите ту же скорость от C и Fortran. Однако возможность использовать ключевое слово restrict только с критически важными функциями производительности означает, что программы на C (и C++) намного безопаснее и проще писать. Например, рассмотрим недопустимый код Fortran:CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), которые большинство компиляторов Fortran будут с удовольствием компилировать без предупреждения, но вводит ошибку, которая появляется только на некоторых компиляторах, на некотором оборудовании и с некоторыми параметрами оптимизации.


да, в 1980; в 2008? зависит

когда я начал профессионально программировать, доминирование скорости Fortran просто оспаривалось. Я помню читать об этом в доктор Доббс

поэтому у меня есть два взгляда на это, теоретический и практический. в теории Fortran сегодня не имеет внутреннего преимущества для C / C++ или даже любого языка, который позволяет код сборки. In практика Fortran сегодня по-прежнему пользуется преимуществами наследия истории и культуры, построенной вокруг оптимизации числового кода.

до и включая Fortran 77, языковые соображения дизайна имели оптимизацию в качестве основного внимания. Из-за состояния теории компиляторов и технологии это часто означало ограничения функции и возможности, чтобы дать компилятору лучший шанс на оптимизацию кода. Хорошая аналогия-думать о Fortran 77 как о профессиональный гоночный автомобиль, который жертвует функциями для скорости. В эти дни компиляторы стали лучше на всех языках, и функции для производительности программиста более ценятся. Однако есть еще места, где люди в основном озабочены скоростью научных вычислений; эти люди, скорее всего, унаследовали код, обучение и культуру от людей, которые сами были программистами Fortran.

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

прекрасное место, чтобы начать изучение история и культура Fortran-Википедия. запись Fortran Wikipedia превосходно, и я очень ценю тех, кто потратил время и усилия, чтобы сделать его ценным для сообщества Fortran.

(укороченная версия этого ответа была бы комментарием в отличном потоке, начатом Нилс


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

плотное умножение матрицы просто:

matmul(a,b)

L2 норма вектора x равна:

sqrt(sum(x**2))

более того заявления, такие как FORALL, PURE & ELEMENTAL процедуры etc. далее помогите оптимизировать код. Даже указатели в Fortran arent такой же гибкий, как C, по этой простой причине.

в предстоящем Fortran standard (2008) есть со-массивы, которые позволяют легко писать параллельный код. G95 (с открытым исходным кодом) и компиляторы от CRAY уже поддерживают его.

так что да Fortran может быть быстрым просто потому, что компиляторы могут оптимизировать / распараллелить его лучше, чем C/C++. Но опять же как и все остальное в жизни есть хорошие и плохие компиляторы компиляторов.


забавно, что много ответов здесь от незнания языков. Это особенно верно для программистов на C / C++, которые открыли и старый код FORTRAN 77 и обсуждают слабые места.

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

о самом языке, Fortran в настоящее время поддерживает полные функции ООП, и он полностью обратно совместим. Я использовал Fortran 2003 тщательно, и я бы сказал, что это было просто восхитительно использовать его. В некоторых аспектах Fortran 2003 по-прежнему отстает от C++, но давайте посмотрим на использование. Fortran в основном используется для численных вычислений, и никто не использует причудливые функции C++ OOP из-за причин скорости. В высокопроизводительных вычислениях C++ почти некуда идти(посмотрите на MPI standard, и вы увидите, что C++ устарел!).

В настоящее время вы можете просто делать смешанное языковое Программирование с Fortran и C/C++. Есть даже интерфейсы для GTK+ в Fortran. Есть бесплатные компиляторы (gfortran, g95) и много отличных коммерческих.


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

  • чистые и элементарные ключевые слова о функциях. Это функции, которые не имеют побочных эффектов. Это позволяет оптимизировать в некоторых случаях, когда компилятор знает, что одна и та же функция будет вызываться с помощью же ценность. Примечание: GCC реализует "чистый" как расширение языка. Другие компиляторы также могут. Межмодульный анализ также может выполнять эту оптимизацию, но это сложно.

  • стандартный набор функций, которые имеют дело с массивами, а не отдельные элементы. Такие вещи, как sin (), log (), sqrt (), берут массивы вместо скаляров. Это облегчает оптимизацию процедуры. авто-векторизации дает те же преимущества, в большинстве случаев, если эти функции являются ли встроенные или встроенные

  • встроенный сложный тип. Теоретически это может позволить компилятору переупорядочить или исключить определенные инструкции в определенных случаях, но, скорее всего, вы увидите ту же выгоду со структурой { double re, im; }; идиома, используемая в C. Это ускоряет разработку, хотя операторы работают над сложными типами в fortran.


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

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


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

что вам действительно нужно спросить: "является ли код, скомпилированный с компилятором Fortran X быстрее, чем эквивалентный код, скомпилированный с компилятором C Y?"Ответ на этот вопрос, конечно, зависит от того, какие два компилятора вы выберете.

другой вопрос, который можно было бы задать, будет примерно таким: "учитывая то же количество усилий, приложенных для оптимизации в своих компиляторах, какой компилятор будет производить более быстрый код?" Ответом на это было бы:Фортран. Компиляторы Fortran имеют преимущества certian:

  • Fortran пришлось конкурировать с Assembly еще в те времена, когда некоторые клялись никогда не использовать компиляторы, поэтому он был разработан для скорости. C был разработан, чтобы быть гибким.
  • ниша Фортрана была хруст числа. В этом домене код никогда достаточно быстро. Поэтому всегда было много давления, чтобы сохранить язык эффективный.
  • большинство исследований в области оптимизации компиляторов выполняется людьми, заинтересованными в ускорении кода хрустящего числа Fortran, поэтому оптимизация кода Fortran является гораздо более известной проблемой, чем оптимизация любого другого скомпилированного языка, и сначала появляются новые инновации в компиляторах Fortran.
  • Бигги: C поощряет гораздо больше использования указателя, чем Fortran. Это резко увеличивает потенциальную область любого элемента данных в программе C, которая делает их намного сложнее оптимизировать. Обратите внимание, что Ada также намного лучше, чем C в этой области, и является гораздо более современным языком OO, чем обычно встречающийся Fortran77. Если вы хотите OO langauge, который может генерировать код быстрее, чем C, это вариант для вас.
  • опять же из-за своей ниши с числом, клиенты компиляторов Fortran, как правило, больше заботятся об оптимизации, чем клиенты компиляторов C.

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


есть еще один пункт, где Fortran отличается от C-и потенциально быстрее. Fortran имеет лучшие правила оптимизации, чем C. В Fortran порядок оценки выражений не определен, что позволяет компилятору оптимизировать его - если вы хотите заставить определенный порядок, нужно использовать круглые скобки. В C порядок намного строже, но с вариантами" - fast "они более расслаблены и" (...)" также игнорируются. Я думаю, что у Фортрана есть путь, который прекрасно лежит посередине. (Ну, IEEE делает жизнь более трудной, поскольку некоторые изменения порядка оценки требуют, чтобы не происходило переполнения, которое либо следует игнорировать, либо препятствует оценке).

другой областью более умных правил являются комплексные числа. Мало того, что это заняло до C 99, что C имел их, также правила управляют ими лучше в Fortran; поскольку библиотека Fortran gfortran частично написана на C, но реализует семантику Fortran, GCC получил опцию (которая также может использоваться с "нормальным" C программы):

- fcx-fortran-правила Сложное умножение и деление следуют правилам Фортрана. Уменьшение диапазона выполняется в рамках сложного деления, но нет проверки, является ли результат сложного умножения или деления "NaN + I*NaN", с попыткой спасти ситуацию в этом случае.

упомянутые выше правила псевдонимов - это еще один бонус, а также - по крайней мере, в принципе-операции с целым массивом, которые при правильном учетная запись оптимизатора компилятора, может привести к более быстрому коду. На противоположной стороне, что определенная операция занимает больше времени, например, если вы делаете назначение распределяемому массиву, необходимо много проверок (перераспределить? [Функция Fortran 2003], имеет шаги массива и т. д.), которые делают простую операцию более сложной за кулисами - и, следовательно, медленнее, но делают язык более мощным. С другой стороны, операции массива с гибкими границами и шагами облегчают напишите код-и компилятор обычно лучше оптимизирует код, чем пользователь.

в целом, я думаю, что и C, и Fortran примерно одинаково быстры; выбор должен быть больше, какой язык нравится больше, или использование операций всего массива Fortran и его лучшей переносимости более полезны-или лучшее взаимодействие с системными и графическими библиотеками пользовательского интерфейса в C.


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

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

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


Я сравниваю скорость Fortran, C и C++ с классическим эталоном Левина-Каллахана-Донгарры из netlib. Версия на нескольких языках с OpenMP http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C уродливее, так как он начался с автоматического перевода, а также вставки ограничений и прагм для некоторых компиляторов. C++ - это просто C с шаблонами STL, где это применимо. На мой взгляд, STL-это смешанная сумка, улучшается ли она ремонтопригодность.

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

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

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


Я занимался обширной математикой с FORTRAN и C в течение нескольких лет. Из моего собственного опыта я могу сказать, что FORTRAN иногда действительно лучше, чем C, но не за его скорость (можно заставить C работать так же быстро, как FORTRAN, используя соответствующий стиль кодирования), а скорее из-за очень хорошо оптимизированных библиотек, таких как LAPACK, и из-за большого распараллеливания. На мой взгляд, FORTRAN действительно неудобно работать, и его преимущества недостаточно хороши, чтобы отменить этот недостаток, поэтому теперь я использую C+GSL для выполнения вычислений.


Я программист-любитель, и я "средний" на обоих языках. Мне легче писать быстрый код Fortran, чем код C (или c++). И Fortran, и C являются "историческими" языками (по сегодняшнему стандарту), широко используются и имеют хорошо поддерживаемый бесплатный и коммерческий компилятор.

Я не знаю, является ли это историческим фактом, но Fortran чувствует, что он построен для параллельного/распределенного/векторизованного/чего-то-многоядерного. И сегодня это в значительной степени "стандартная метрика", когда мы говорим о скорости: "она масштабируется ?"

для чистого хруста процессора я люблю Fortran. Для всего, что связано с IO, мне легче работать с C. (В любом случае это сложно в обоих случаях).

теперь, конечно, для параллельного математического интенсивного кода Вы, вероятно, захотите использовать свой GPU. И C, и Fortran имеют много более или менее хорошо интегрированного интерфейса CUDA/OpenCL (и теперь OpenACC).

моя в меру объективный ответ : Если вы знаете оба языка одинаково хорошо/плохо я думаю Fortran быстрее, потому что мне легче писать параллельный / распределенный код в Fortran, чем C. (Как только вы поняли, что можете написать "freeform" fortran, а не только строгий код F77)

вот 2-й ответ для тех, кто хочет понизить меня, потому что им не нравится 1-й ответ : оба языка имеют функции, необходимые для написания высокопроизводительного кода. Так это зависит от алгоритма реализации (процессор ? Ио интенсивной ? интенсивная память?), оборудование (одиночное процессор ? многоядерный ? распространять суперкомпьютер ? С GPGPU ? FPGA ?), ваше мастерство и, в конечном счете, сам компилятор. И C, и Fortran имеют потрясающий компилятор. (я серьезно поражен тем, насколько продвинутые компиляторы Fortran, но и компиляторы C).

PS: Я рад, что вы специально исключили libs, потому что у меня есть много плохих вещей, чтобы сказать о Fortran GUI libs. :)


Я не слышал, что Fortan значительно быстрее, чем C, но в некоторых случаях это может быть возможно, что это будет быстрее. И ключ не в языковых особенностях, которые присутствуют, а в тех, которые (обычно) отсутствуют.

пример с указателями. Указатели C используются практически везде, но проблема с указателями заключается в том, что компилятор обычно не может сказать, указывают ли они на разные части одного массива.

например, если вы написал процедуру strcpy, которая выглядела так:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

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

[Я должен отметить, что C99 имеет ключевое слово "restrict", которое явно сообщает компиляторам, что указатели не перекрываются. Также обратите внимание, что Fortran тоже имеет указатели с семантикой, отличной от семантики C, но указатели не вездесущи, как в C.]

но возвращаясь к С и Фортране, можно предположить, что компилятор Фортрана способен выполнять некоторые оптимизации, которые могут не быть возможными для (прямо написано) программа на языке Си. Так что я бы не слишком удивился. Однако, я ожидаю, что разница в производительности не так много. [~5-10%]


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

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


быстро и просто: оба одинаково быстры, но Fortran проще. Что действительно быстрее в конечном итоге зависит от алгоритма, но в любом случае нет значительной разницы в скорости. Это то, что я узнал на семинаре Fortran в высокопроизводительном вычислительном центре Stuttgard, Германия в 2015 году. Я работаю как с Fortran, так и с C и разделяю это мнение.

объяснение:

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

Fortran был разработан для научного программирования. По этой причине он поддерживает написание быстрого синтаксиса кода, поскольку это основная цель Fortran. В отличие от общественного мнения, Fortran не является устаревшим языком программирования. Его последний стандарт 2010 и новые компиляторы публикуются на регулярной основе, как наиболее высокие код производительности записывается в Fortran. Fortran также поддерживает современные функции в качестве директив компилятора (в C pragmas).

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

C поддерживает как вызов по ссылке и вызов по значению, что является удобной функцией. В нашем случае программист может случайно использовать call by value. Это значительно замедляет работу, так как сначала структуру нужно скопировать в память.

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


обычно FORTRAN медленнее, чем C. C может использовать указатели аппаратного уровня, позволяющие программисту оптимизировать вручную. FORTRAN (в большинстве случаев)не имеет доступа к аппаратным средствам адресации памяти. (ВАКС Фортран-это совсем другая история. Я использую FORTRAN время от времени с 70-х годов. (Правда.)

однако, начиная с 90-х годов FORTRAN эволюционировал, чтобы включить конкретные языковые конструкции, которые могут быть оптимизированы в по существу параллельные алгоритмы, которые can действительно крик на многоядерном процессоре. Например, автоматическая векторизация позволяет нескольким процессорам обрабатывать каждый элемент в векторе данных одновременно. 16 процессоров -- 16 элементов вектора -- обработка занимает 1/16 времени.

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

в FORTRAN вам нужно только разработать свой алгоритм тщательно для мульти-обработки. Компилятор и время выполнения могут обрабатывать остальное за вас.

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


более быстрый код на самом деле не соответствует языку, это компилятор, поэтому вы можете увидеть ms-VB "компилятор", который генерирует раздутый, медленный и избыточный объектный код, который связан вместе внутри ".exe", но powerBasic генерирует слишком лучший код. Объектный код, созданный компиляторами C и c++, генерируется на некоторых этапах (не менее 2), но по дизайну большинство компиляторов Fortran имеют не менее 5 этапов, включая высокоуровневые оптимизации, поэтому по дизайну Fortran всегда будет иметь возможность генерировать оптимизированный код. Поэтому в конце компилятор не тот язык, который вы должны попросить, лучший компилятор, который я знаю, - это компилятор Intel Fortran, потому что вы можете получить его в LINUX и Windows, и вы можете использовать VS в качестве IDE, если вы ищете дешевый компилятор tigh, который вы всегда можете передать на OpenWatcom.

подробнее об этом: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html


Fortran имеет лучшие процедуры ввода-вывода, например, подразумеваемый объект do дает гибкость, которую стандартная библиотека C не может соответствовать.

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


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

быть fortran быстрее или медленнее с точки зрения вычислительной мощности в конце концов может иметь свою важность, но если для разработки чего-то в Fortran требуется в 5 раз больше времени, потому что:

  • ему не хватает хорошей библиотеки для задач, отличных от чистого числа хруста
  • ему не хватает достойного инструмента для документации и блока тестирование
  • это язык с очень низкой выразительностью, стремительно увеличивающий количество строк кода.
  • он имеет очень плохую обработку строк
  • он имеет бессмысленное количество проблем среди различных компиляторов и архитектур, сводящих вас с ума.
  • он имеет очень плохую стратегию ввода-вывода (чтение/запись последовательных файлов. Да, файлы произвольного доступа существуют, но вы когда-нибудь видели их?)
  • это не способствует надлежащей практике развития, модуляризация.
  • эффективное отсутствие полностью стандартного, полностью совместимого компилятора opensource (как gfortran, так и g95 не поддерживают все)
  • очень плохая совместимость с C (mangling: одно подчеркивание, два подчеркивания, без подчеркивания, в общем, одно подчеркивание, но два, если есть другое подчеркивание. и пусть только не копаются в общих блоках...)

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


используя современные стандарты и компилятор, нет!

некоторые из людей здесь предположили, что FORTRAN быстрее, потому что компилятору не нужно беспокоиться об алиасировании (и, следовательно, может делать больше предположений во время оптимизации). Однако это было рассмотрено в C начиная со стандарта C99 (я думаю) с включением ключевого слова restrict. Что в основном говорит компилятору, что в пределах области give указатель не имеет псевдонимов. Кроме того, C включает правильный указатель арифметика, где такие вещи, как сглаживание, могут быть очень полезны с точки зрения производительности и распределения ресурсов. Хотя я думаю, что более поздняя версия FORTRAN позволяет использовать" правильные " указатели.

для современных реализаций c general превосходит FORTRAN (хотя и очень быстро).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

EDIT:

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

http://julialang.org/benchmarks/

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


Fortran может обрабатывать массив, особенно многомерные массивы, очень удобно. Нарезка элементов многомерного массива в Fortran может быть намного проще, чем в C/C++. C++ теперь имеет библиотеки, которые могут выполнять эту работу, такие как Boost или Eigen, но они все-таки являются внешними библиотеками. В Fortran эти функции являются внутренними.

является ли Fortran быстрее или удобнее для разработки в основном зависит от работы, которую вам нужно закончить. Как человек научного вычисления для геофизика, я сделал большую часть вычислений в Fortran (я имею в виду современный Fortran, >=F90).


Это более чем несколько субъективно, потому что он попадает в качество компиляторов и таких больше, чем что-либо еще. Однако, чтобы более прямо ответить на ваш вопрос, говоря с точки зрения языка / компилятора, нет ничего о Fortran над C, что сделает его по своей сути быстрее или лучше, чем C. Если вы делаете тяжелые математические операции, это будет сводиться к качеству компилятора, навыку программиста на каждом языке и встроенным библиотекам поддержки математики это поддерживает эти операции, чтобы в конечном итоге определить, что будет быстрее для данной реализации.

EDIT: другие люди, такие как @Nils, подняли хороший момент о разнице в использовании указателей в C и возможности для псевдонимов, что, возможно, делает самые наивные реализации медленнее в C. Однако есть способы справиться с этим в C99, через флаги оптимизации компилятора и/или в том, как на самом деле написан C. Это хорошо освещено в ответе @Nils и последующие комментарии, которые следуют за его ответом.


Fortran традиционно не устанавливает такие параметры, как-FP:strict (который требуется ifort для включения некоторых функций в использовании IEEE_arithmetic, часть стандарта f2003). Intel C++ также не устанавливает-FP:strict по умолчанию, но это необходимо для обработки ERRNO, например, и другие компиляторы C++ не позволяют отключить ERRNO или получить оптимизацию, такую как уменьшение simd. gcc и g++ потребовали от меня настроить Makefile, чтобы избежать использования опасной комбинации-O3 -ffast-math-fopenmp-march=родной. Помимо этих проблем, этот вопрос об относительной производительности становится более придирчивым и зависит от локальных правил выбора компиляторов и опций.