Od czasu do czasu czytam, że Fortran jest lub może być szybszy niż C do ciężkich obliczeń. Czy to naprawdę prawda? Muszę przyznać, że prawie nie znam Fortrana, ale kod Fortrana, który do tej pory widziałem, nie pokazuje, że język ma funkcje, których C nie ma.
Jeśli to prawda, proszę powiedz mi dlaczego. Proszę, nie mów mi, jakie języki lub biblioteki są odpowiednie do łamania numerów, nie zamierzam pisać aplikacji ani bibliotek, aby to zrobić, jestem po prostu ciekawy.
c
performance
fortran
chinmary
źródło
źródło
Odpowiedzi:
Języki mają podobne zestawy funkcji. Różnica w wydajności wynika z faktu, że Fortran twierdzi, że aliasing jest niedozwolony, chyba że użyto instrukcji EQUIVALENCE. Każdy kod z aliasingiem nie jest prawidłowy Fortran, ale wykrycie tych błędów zależy od programisty, a nie od kompilatora. Zatem kompilatory Fortran ignorują możliwe aliasing wskaźników pamięci i pozwalają im na generowanie bardziej wydajnego kodu. Spójrz na ten mały przykład w C:
Ta funkcja działałaby wolniej niż odpowiednik Fortrana po optymalizacji. Dlaczego tak? Jeśli zapisujesz wartości w tablicy wyjściowej, możesz zmienić wartości macierzy. W końcu wskaźniki mogą się nakładać i wskazywać na ten sam fragment pamięci (w tym
int
wskaźnik!). Kompilator C jest zmuszony do ponownego załadowania czterech wartości macierzy z pamięci dla wszystkich obliczeń.W Fortranie kompilator może załadować wartości macierzy jeden raz i zapisać je w rejestrach. Może to zrobić, ponieważ kompilator Fortran zakłada, że wskaźniki / tablice nie nakładają się na siebie w pamięci.
Na szczęście
restrict
słowo kluczowe i ścisłe aliasing zostały wprowadzone do standardu C99, aby rozwiązać ten problem. Jest również dobrze obsługiwany w większości kompilatorów C ++. Słowo kluczowe pozwala dać kompilatorowi wskazówkę, że programista obiecuje, że wskaźnik nie będzie aliasowany z żadnym innym wskaźnikiem. Ścisłe aliasing oznacza, że programista obiecuje, że wskaźniki innego typu nigdy się nie pokryją, na przykład adouble*
nie będzie się nakładać zint*
(z konkretnym wyjątkiemchar*
ivoid*
może nakładać się na wszystko).Jeśli ich użyjesz, otrzymasz taką samą prędkość od C i Fortran. Jednak możliwość używania
restrict
słowa kluczowego tylko z funkcjami krytycznymi pod względem wydajności oznacza, że programy C (i C ++) są znacznie bezpieczniejsze i łatwiejsze do napisania. Rozważmy na przykład nieprawidłowy kod Fortran:CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
który większość kompilatorów Fortran z przyjemnością skompiluje bez żadnego ostrzeżenia, ale wprowadza błąd, który pojawia się tylko w niektórych kompilatorach, na niektórych urządzeniach i przy niektórych opcjach optymalizacji.źródło
call transform
przykład nie ma większego sensu.Tak, w 1980 roku; w 2008? zależy
Kiedy zacząłem profesjonalnie programować, dominacja szybkości Fortrana była właśnie kwestionowana. Pamiętam, jak czytałem o tym w Dr. Dobbs i opowiadałem starszym programistom o tym artykule - śmiali się.
Mam więc dwa poglądy na ten temat, teoretyczny i praktyczny. Teoretycznie Fortran nie ma dziś żadnej wewnętrznej przewagi nad C / C ++, a nawet jakimkolwiek językiem, który pozwala na kod asemblera. W praktyce Fortran dzisiaj nadal korzysta z dobrodziejstw historii i kultury zbudowanej wokół optymalizacji kodu numerycznego.
Aż do Fortran 77 włącznie, rozważania dotyczące projektowania języka koncentrowały się na optymalizacji. Ze względu na stan teorii i technologii kompilatora często oznaczało to ograniczenie funkcji i możliwości, aby dać kompilatorowi najlepsze możliwości optymalizacji kodu. Dobrą analogią jest myślenie o Fortran 77 jako profesjonalnym samochodzie wyścigowym, który poświęca cechy prędkości. Obecnie kompilatory są coraz lepsze we wszystkich językach, a funkcje zwiększające produktywność programistów są bardziej cenione. Jednak wciąż istnieją miejsca, w których ludzie zajmują się głównie szybkością obliczeń naukowych; ci ludzie najprawdopodobniej odziedziczyli kod, szkolenia i kulturę od ludzi, którzy sami byli programistami Fortran.
Kiedy zaczyna się mówić o optymalizacji kodu, pojawia się wiele problemów, a najlepszym sposobem, aby to wyczuć, jest czyhanie tam, gdzie ludzie mają za zadanie mieć szybki kod numeryczny . Należy jednak pamiętać, że taki krytycznie wrażliwy kod stanowi zwykle niewielki ułamek ogólnych linii kodu i jest bardzo wyspecjalizowany: duża część kodu Fortran jest tak samo „nieefektywna” jak wiele innych kodów w innych językach, a optymalizacja nie powinna nawet być podstawowa obawa takiego kodu .
Wspaniałym miejscem do rozpoczęcia nauki o historii i kulturze Fortran jest wikipedia. Wpis w Fortran Wikipedia jest znakomity i bardzo doceniam tych, którzy poświęcili czas i wysiłek, aby uczynić go wartościowym dla społeczności Fortran.
(Skrócona wersja tej odpowiedzi byłaby komentarzem do doskonałego wątku zapoczątkowanego przez Nilsa, ale nie mam na to karmy. Właściwie prawdopodobnie nie napisałbym niczego, gdyby nie to, że wątek ten ma treści informacyjne i dzielenie się w przeciwieństwie do wojen płomiennych i bigoterii językowej, co jest moim głównym doświadczeniem w tym temacie. Byłem przytłoczony i musiałem podzielić się miłością.)
źródło
Do pewnego stopnia Fortran został zaprojektowany z myślą o optymalizacji kompilatora. Język obsługuje operacje na całej tablicy, w których kompilatory mogą wykorzystywać równoległość (szczególnie w procesorach wielordzeniowych). Na przykład,
Mnożenie gęstej macierzy to po prostu:
Norma L2 wektora x to:
Ponadto instrukcje takie jak
FORALL
,PURE
&ELEMENTAL
procedury itp. Dodatkowo pomagają zoptymalizować kod. Nawet wskaźniki w Fortranie nie są tak elastyczne jak C z tego prostego powodu.Nadchodzący standard Fortran (2008) ma wspólne tablice, które pozwalają na łatwe pisanie kodu równoległego. G95 (open source) i kompilatory CRAY już go obsługują.
Tak, więc Fortran może być szybki, ponieważ kompilatory mogą go zoptymalizować / zrównoleglić lepiej niż C / C ++. Ale znowu, jak wszystko inne w życiu, istnieją dobre i złe kompilatory.
źródło
forall
Konstrukt jest przestarzała, ponieważ kompilatory nie mógł zoptymalizować kod dobrze. Zastąpienie jestdo concurrent
. Ponadto kodsqrt(sum(x**2))
wygląda na nieefektywny, ponieważ kompilator prawdopodobnie konstruuje cały wektorx**2
. Sądzę, że pętla jest lepsza, ale bez wątpienia najlepiej jest wywoływać funkcję wewnętrznąnorm2
.To zabawne, że wiele odpowiedzi tutaj nie zna języków. Jest to szczególnie prawdziwe w przypadku programistów C / C ++, którzy otworzyli stary kod FORTRAN 77 i dyskutowali o słabościach.
Podejrzewam, że kwestia prędkości jest głównie pytaniem między C / C ++ a Fortranem. W ogromnym kodzie zawsze zależy to od programisty. Istnieją pewne cechy języka, które Fortran przewyższa, i niektóre cechy, które robi C. Tak więc w 2011 roku nikt nie może powiedzieć, który z nich jest szybszy.
Jeśli chodzi o sam język, Fortran obsługuje obecnie pełne funkcje OOP i jest w pełni kompatybilny wstecz. Dokładnie korzystałem z Fortran 2003 i powiedziałbym, że korzystanie z niego było po prostu zachwycające. W niektórych aspektach Fortran 2003 nadal stoi za C ++, ale spójrzmy na użycie. Fortran jest najczęściej używany do obliczeń numerycznych i nikt nie używa wymyślnych funkcji C ++ OOP ze względu na szybkość. W obliczeniach o wysokiej wydajności C ++ prawie nie ma dokąd pójść (spójrz na standard MPI, a zobaczysz, że C ++ jest przestarzały!).
Obecnie możesz po prostu programować w różnych językach za pomocą Fortran i C / C ++. Istnieją nawet interfejsy dla GTK + w Fortran. Istnieją bezpłatne kompilatory (gfortran, g95) i wiele doskonałych komercyjnych.
źródło
Istnieje kilka powodów, dla których Fortran może być szybszy. Jednak ilość, którą mają znaczenie, jest tak mało znacząca lub można ją zmienić, że nie powinno to mieć znaczenia. Głównym powodem korzystania z Fortran jest obecnie utrzymanie lub rozszerzenie starszych aplikacji.
Słowa kluczowe PURE i ELEMENTAL dotyczące funkcji. Są to funkcje, które nie mają skutków ubocznych. Umożliwia to optymalizację w niektórych przypadkach, gdy kompilator wie, że ta sama funkcja zostanie wywołana z tymi samymi wartościami. Uwaga: GCC implementuje „czysty” jako rozszerzenie języka. Inne kompilatory również mogą. Analiza między modułami może również przeprowadzić tę optymalizację, ale jest to trudne.
standardowy zestaw funkcji zajmujących się tablicami, a nie pojedynczymi elementami. Rzeczy takie jak sin (), log (), sqrt () pobierają tablice zamiast skalarów. Ułatwia to optymalizację rutyny. Automatyczna wektoryzacja daje te same korzyści w większości przypadków, jeśli funkcje te są wbudowane lub wbudowane
Wbudowany typ złożony. Teoretycznie może to pozwolić kompilatorowi na zmianę kolejności lub wyeliminowanie niektórych instrukcji w niektórych przypadkach, ale prawdopodobnie zobaczysz tę samą korzyść z struct {double re, im; }; idiom używany w C. To sprawia, że szybszy rozwój, ponieważ operatorzy pracują na złożonych typach w fortran.
źródło
{ double re, im; };
użytym w C". Kompilatory C najprawdopodobniej zwrócą tę strukturę w postaci sret ze stosem wywołującym przydzielającym miejsce, przekazując wskaźnik do odbiorcy, który go wypełnia. Jest to kilka razy wolniejsze niż zwracanie wielu wartości w rejestrach, tak jak zrobiłby to kompilator Fortran. Zauważ, że C99 naprawił to w szczególnym przypadku kompleksu.Myślę, że kluczową kwestią na korzyść Fortran jest to, że jest to język nieco bardziej odpowiedni do wyrażania matematyki opartej na wektorach i tablicach. Wskazany powyżej problem analizy wskaźnika jest prawdziwy w praktyce, ponieważ przenośny kod nie może tak naprawdę zakładać, że można powiedzieć kompilatorowi coś. ZAWSZE jest korzyść z obliczania wyrażeń w sposób bliższy wyglądowi domeny. C tak naprawdę wcale nie ma tablic, jeśli przyjrzysz się uważnie, po prostu coś takiego się zachowuje. Fortran ma prawdziwe umiejętności. Co ułatwia kompilację dla niektórych rodzajów algorytmów, szczególnie dla maszyn równoległych.
W głębi rzeczy, takich jak system wykonawczy i konwencje wywoływania, C i współczesny Fortran są wystarczająco podobne, że trudno jest dostrzec, co by miało znaczenie. Zauważ, że C tutaj jest naprawdę podstawową C: C ++ to zupełnie inny problem z bardzo różnymi cechami wydajności.
źródło
Nie ma czegoś takiego, że jeden język jest szybszy od drugiego, więc poprawna odpowiedź brzmi „ nie” .
To, co naprawdę musisz zapytać, to „czy kod jest kompilowany za pomocą kompilatora Fortran X szybciej niż równoważny kod kompilowany za pomocą kompilatora C Y?” Odpowiedź na to pytanie zależy oczywiście od tego, które dwa kompilatory wybierzesz.
Kolejne pytanie, które można by zadać, brzmiałoby następująco: „Biorąc pod uwagę tyle samo wysiłku włożonego w optymalizację w ich kompilatorach, który kompilator wygenerowałby szybszy kod?” Odpowiedzią na to byłoby w rzeczywistości Fortran . Kompilatory Fortran mają zalety Certian:
Jednak nic nie stoi na przeszkodzie, aby ktoś włożył wiele wysiłku w optymalizację kompilatora C i sprawił, że generuje on lepszy kod niż kompilator Fortran na swojej platformie. W rzeczywistości większa sprzedaż generowana przez kompilatory C sprawia, że ten scenariusz jest całkiem wykonalny
źródło
Jest inny przedmiot, w którym Fortran różni się od C - i potencjalnie jest szybszy. Fortran ma lepsze reguły optymalizacji niż C. W Fortranie kolejność oceny wyrażeń nie jest zdefiniowana, co pozwala kompilatorowi na zoptymalizowanie jej - jeśli ktoś chce wymusić określoną kolejność, musi użyć nawiasów. W C kolejność jest znacznie bardziej rygorystyczna, ale z opcjami „-fast” są bardziej zrelaksowane i „(...)” są również ignorowane. Myślę, że Fortran ma sposób, który ładnie leży na środku. (Cóż, IEEE utrudnia życie na żywo, ponieważ niektóre zmiany kolejności oceny wymagają, aby nie doszło do przepełnienia, które albo należy zignorować, albo utrudnia ocenę).
Kolejnym obszarem mądrzejszych reguł są liczby zespolone. Nie tylko, że zajęło to C 99, że C je miał, ale zasady rządzące nimi są lepsze w Fortranie; ponieważ biblioteka gfortranu Fortrana jest częściowo napisana w C, ale implementuje semantykę Fortrana, GCC zyskało opcję (która może być również używana z „normalnymi” programami C):
Wspomniane powyżej reguły aliasów to kolejna premia, a także - przynajmniej w zasadzie - operacje na całej tablicy, które odpowiednio uwzględnione przez optymalizator kompilatora mogą przyspieszyć kod. Z drugiej strony niektóre operacje wymagają więcej czasu, np. Jeśli wykonasz przypisanie do tablicy, którą można alokować, konieczne jest przeprowadzenie wielu kontroli (realokacja? [Funkcja Fortran 2003], przesuwanie się macierzy itp.), Co powoduje, że prosta operacja jest bardziej złożona za kulisami - a zatem wolniejsza, ale sprawia, że język jest mocniejszy. Z drugiej strony operacje tablicowe z elastycznymi granicami i krokami ułatwiają pisanie kodu - a kompilator zazwyczaj lepiej optymalizuje kod niż użytkownik.
W sumie uważam, że zarówno C, jak i Fortran są równie szybkie; wybór powinien polegać bardziej na tym, który język bardziej mu się podoba, lub na tym, czy użytkowanie operacji Fortran na całej tablicy i jego lepsza przenośność są bardziej przydatne - lub lepsze połączenie z bibliotekami systemowymi i graficznymi interfejsami użytkownika w C.
źródło
Nie ma nic w językach Fortran i C, które sprawiają, że jeden jest szybszy od drugiego do określonych celów. Istnieją specyficzne kompilatory dla każdego z tych języków, które sprawiają, że niektóre z nich są bardziej korzystne dla niektórych zadań niż inne.
Przez wiele lat istniały kompilatory Fortran, które potrafiły czarną magię w twoich procedurach numerycznych, czyniąc wiele ważnych obliczeń niesamowicie szybkim. Współczesne kompilatory C również nie mogły tego zrobić. W rezultacie w Fortranie powstało wiele świetnych bibliotek kodu. Jeśli chcesz korzystać z tych dobrze przetestowanych, dojrzałych, wspaniałych bibliotek, przełamujesz kompilator Fortran.
Moje nieformalne obserwacje pokazują, że w dzisiejszych czasach ludzie kodują swoje ciężkie obliczenia w dowolnym starym języku i jeśli to zajmuje chwilę, znajdują czas w jakimś tanim klastrze obliczeniowym. Prawo Moore'a czyni z nas wszystkich głupców.
źródło
Porównuję prędkość Fortran, C i C ++ z klasycznym testem porównawczym Levine-Callahan-Dongarra od netlib. Wersja wielojęzyczna z OpenMP to http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C jest brzydsze, ponieważ zaczęło się od automatycznego tłumaczenia, a także dodawania ograniczeń i pragmatów dla niektórych kompilatory. C ++ to po prostu C z szablonami STL, w stosownych przypadkach. Moim zdaniem STL jest mieszanym workiem, czy poprawia łatwość konserwacji.
Jest tylko minimalne ćwiczenie automatycznego wstawiania funkcji, aby zobaczyć, w jakim stopniu poprawia ono optymalizację, ponieważ przykłady opierają się na tradycyjnej praktyce Fortrana, w której niewielka zależność polega na wstawianiu.
Kompilatorowi C / C ++, który jest jak dotąd najbardziej rozpowszechniony, brakuje auto-wektoryzacji, na której w dużej mierze polegają te testy porównawcze.
Odnośnie posta, który pojawił się tuż przed tym: istnieje kilka przykładów, w których nawiasy są używane w Fortranie, aby dyktować szybszą lub dokładniejszą kolejność oceny. Znane kompilatory C nie mają opcji obserwowania nawiasów bez wyłączania ważniejszych optymalizacji.
źródło
Jestem programistą hobbystycznym i jestem „przeciętna” w obu językach. Łatwiej jest mi napisać szybki kod Fortran niż kod C (lub C ++). Zarówno Fortran, jak i C są językami „historycznymi” (jak na dzisiejszy standard), są intensywnie używane i mają dobrze obsługiwany darmowy i komercyjny kompilator.
Nie wiem, czy to fakt historyczny, ale Fortran ma wrażenie, że jest zbudowany tak, aby był równoległy / dystrybuowany / wektoryzowany / cokolwiek-wiele rdzeni. A dzisiaj jest to właściwie „standardowa metryka”, kiedy mówimy o prędkości: „czy to skaluje się?”
Dla czystego chrupania procesora uwielbiam Fortran. W przypadku wszystkiego, co dotyczy IO, łatwiej mi pracować z C. (w każdym razie jest to trudne).
Teraz, oczywiście, w przypadku kodu równoległego intensywnie wykorzystującego matematykę prawdopodobnie będziesz chciał użyć swojego GPU. Zarówno C, jak i Fortran mają dużo mniej lub bardziej dobrze zintegrowany interfejs CUDA / OpenCL (a teraz OpenACC).
Moja umiarkowanie obiektywna odpowiedź brzmi: jeśli znasz oba języki równie dobrze / słabo, to myślę, że Fortran jest szybszy, ponieważ łatwiej jest mi pisać równoległy / rozproszony kod w Fortranie niż C. (gdy zrozumiesz, że możesz pisać „dowolny formularz” fortran i nie tylko ścisły kod F77)
Oto druga odpowiedź dla tych, którzy chcą głosować za mną, ponieważ nie lubią pierwszej odpowiedzi: Oba języki mają funkcje wymagane do pisania kodu o wysokiej wydajności. Zależy to więc od algorytmu, który implementujesz (procesor intensywny? Io intensywność? Intensywnie pamięci?), Sprzętu (pojedynczy procesor? Wielordzeniowy? Dystrybuuj superkomputer? GPGPU? FPGA?), Twoich umiejętności, a ostatecznie samego kompilatora. Zarówno C, jak i Fortran mają niesamowity kompilator. (Jestem bardzo zaskoczony zaawansowanymi kompilatorami Fortran, ale kompilatory C również).
PS: Cieszę się, że specjalnie wykluczyłeś biblioteki lib, ponieważ mam wiele złych rzeczy do powiedzenia na temat bibliotek GUI w Fortran. :)
źródło
Przez kilka lat zajmowałem się matematyką FORTRAN i C. Z własnego doświadczenia mogę stwierdzić, że FORTRAN jest czasem naprawdę lepszy niż C, ale nie ze względu na jego szybkość (można sprawić, aby C działał tak szybko jak FORTRAN przy użyciu odpowiedniego stylu kodowania), ale raczej z powodu bardzo dobrze zoptymalizowanych bibliotek, takich jak LAPACK, oraz z powodu wielka równoległość. Moim zdaniem FORTRAN jest naprawdę niewygodny w pracy, a jego zalety nie są wystarczająco dobre, aby anulować tę wadę, więc teraz używam C + GSL do obliczeń.
źródło
Wszelkie różnice prędkości między Fortranem i C będą bardziej funkcją optymalizacji kompilatora i podstawowej biblioteki matematycznej używanej przez dany kompilator. Fortran nie ma nic wspólnego, co by uczyniłoby go szybszym niż C.
W każdym razie dobry programista może pisać Fortran w dowolnym języku.
źródło
Nie słyszałem, że Fortan jest znacznie szybszy niż C, ale można sobie wyobrazić, że w niektórych przypadkach byłby szybszy. Kluczem nie są obecne funkcje językowe, ale te, które (zwykle) są nieobecne.
Przykładem są wskaźniki C. Wskaźniki C są używane prawie wszędzie, ale problem ze wskaźnikami polega na tym, że kompilator zwykle nie jest w stanie stwierdzić, czy wskazują one różne części tej samej tablicy.
Na przykład, jeśli napisałeś prostą procedurę, która wyglądała tak:
Kompilator musi działać przy założeniu, że d i s mogą nakładać się na tablice. Dlatego nie może przeprowadzić optymalizacji, która dałaby różne wyniki, gdy tablice się nakładają. Jak można się spodziewać, znacznie ogranicza to rodzaj optymalizacji, które można wykonać.
[Powinienem zauważyć, że C99 ma słowo kluczowe „ogranicz”, które wyraźnie informuje kompilatory, że wskaźniki nie nakładają się. Zauważ też, że Fortran też ma wskaźniki, z semantyką inną niż C, ale wskaźniki nie są wszechobecne jak w C.]
Ale wracając do kwestii C vs. Fortran, można sobie wyobrazić, że kompilator Fortran jest w stanie przeprowadzić pewne optymalizacje, które mogą nie być możliwe w przypadku (prosto napisanego) programu C. Więc nie byłbym zbyt zaskoczony tym roszczeniem. Spodziewam się jednak, że różnica w wydajności nie byłaby aż tak duża. [~ 5–10%]
źródło
Szybkie i proste: oba są równie szybkie, ale Fortran jest prostszy. To, co naprawdę naprawdę szybciej, zależy od algorytmu, ale i tak nie ma znaczącej różnicy prędkości. Tego nauczyłem się podczas warsztatów Fortran w wysokowydajnym centrum obliczeniowym Stuttgard, Niemcy w 2015 r. Pracuję zarówno z Fortranem, jak i C. Podzielam tę opinię.
Wyjaśnienie:
C został zaprojektowany do pisania systemów operacyjnych. Dlatego ma więcej swobody niż potrzeba do pisania kodu o wysokiej wydajności. Zasadniczo nie stanowi to problemu, ale jeśli nie zaprogramuje się go ostrożnie, można łatwo spowolnić kod.
Fortran został zaprojektowany do programowania naukowego. Z tego powodu obsługuje pisanie szybkiej składni kodu, ponieważ jest to główny cel Fortran. W przeciwieństwie do opinii publicznej, Fortran nie jest przestarzałym językiem programowania. Jego najnowszym standardem jest 2010 r., A nowe kompilatory są regularnie publikowane, ponieważ większość kodu o wysokiej wydajności jest napisana w Fortranie. Fortran ponadto obsługuje nowoczesne funkcje jako dyrektywy kompilatora (w języku C).
Przykład: Chcemy podać dużą strukturę jako argument wejściowy do funkcji (fortran: podprogram). W ramach funkcji argument nie jest zmieniany.
C obsługuje zarówno połączenie przez odniesienie, jak i połączenie według wartości, co jest przydatną funkcją. W naszym przypadku programista może przypadkowo użyć wywołania według wartości. Powoduje to znaczne spowolnienie, ponieważ struktura musi być najpierw skopiowana w pamięci.
Fortran działa tylko z wywołaniem przez odniesienie, co zmusza programistę do ręcznego skopiowania struktury, jeśli naprawdę chce operacji wywołania według wartości. W naszym przypadku fortran będzie automatycznie tak szybki jak wersja C z wywołaniem przez odniesienie.
źródło
Zasadniczo FORTRAN jest wolniejszy niż C. C może korzystać ze wskaźników poziomu sprzętu, umożliwiając programistom ręczną optymalizację. FORTRAN (w większości przypadków) nie ma dostępu do hacków adresujących pamięć sprzętową. (VAX FORTRAN to inna historia.) Używam FORTRAN z przerwami od lat 70-tych. (Naprawdę.)
Jednak od lat 90-tych FORTRAN ewoluował i zawiera konkretne konstrukcje językowe, które można zoptymalizować do z natury równoległych algorytmów, które naprawdę mogą krzyczeć na procesorach wielordzeniowych. Na przykład automatyczne wektoryzowanie pozwala wielu procesorom obsługiwać każdy element w wektorze danych jednocześnie. 16 procesorów - wektor 16 elementów - przetwarzanie zajmuje 1/16 czasu.
W C musisz zarządzać własnymi wątkami i ostrożnie projektować algorytm do wieloprzetwarzania, a następnie użyć szeregu wywołań API, aby upewnić się, że równoległość przebiega poprawnie.
W FORTRAN musisz ostrożnie projektować algorytm do wieloprzetwarzania. Kompilator i środowisko wykonawcze zajmą się resztą.
Możesz przeczytać trochę o High Performance Fortran , ale znajdziesz wiele martwych linków. Lepiej poczytaj o programowaniu równoległym (takim jak OpenMP.org ) i o tym, jak FORTRAN to obsługuje.
źródło
Szybszy kod tak naprawdę nie zależy od języka, jest to kompilator, dzięki czemu można zobaczyć „kompilator” ms-vb, który generuje rozdęty, wolniejszy i nadmiarowy kod obiektu, który jest powiązany w pliku „.exe”, ale powerBasic generuje zbyt wiele lepszy kod. Kod obiektowy utworzony przez kompilatory C i C ++ jest generowany w niektórych fazach (co najmniej 2), ale z założenia większość kompilatorów Fortran ma co najmniej 5 faz, w tym optymalizacje wysokiego poziomu, więc z założenia Fortran zawsze będzie w stanie wygenerować wysoce zoptymalizowany kod. Na koniec kompilator nie jest językiem, o który należy prosić, najlepszym kompilatorem, jaki znam, jest kompilator Intel Fortran, ponieważ możesz go pobrać na LINUX i Windows, a możesz użyć VS jako IDE, jeśli szukasz tani kompilator Tigh, na którym zawsze możesz polegać na OpenWatcom.
Więcej informacji na ten temat: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html
źródło
Fortran ma lepsze procedury We / Wy, np. Domniemana funkcja do daje elastyczność, której standardowa biblioteka C nie może dopasować.
Kompilator Fortran bezpośrednio obsługuje bardziej złożoną składnię, a ponieważ takiej składni nie można łatwo sprowadzić do formy przekazywania argumentów, C nie może jej skutecznie zaimplementować.
źródło
Korzystając z nowoczesnych standardów i kompilatora, nie!
Niektórzy z nas sugerowali, że FORTRAN jest szybszy, ponieważ kompilator nie musi się martwić aliasingiem (a zatem może przyjmować więcej założeń podczas optymalizacji). Jednak zostało to rozwiązane w C od czasu standardu C99 (myślę) z włączeniem słowa kluczowego ograniczającego. Co w zasadzie mówi kompilatorowi, że w podanym zakresie wskaźnik nie jest aliasowany. Ponadto C umożliwia prawidłową arytmetykę wskaźników, gdzie aliasing może być bardzo przydatny pod względem wydajności i alokacji zasobów. Chociaż myślę, że nowsza wersja FORTRAN umożliwia stosowanie „odpowiednich” wskaźników.
W przypadku nowoczesnych wdrożeń ogólne C wyprzedza FORTRAN (choć jest również bardzo szybki).
http://benchmarksgame.alioth.debian.org/u64q/fortran.html
EDYTOWAĆ:
Sprawiedliwa krytyka tego wydaje się być taka, że analiza porównawcza może być stronnicza. Oto inne źródło (w odniesieniu do C), które daje wynik w większym kontekście:
http://julialang.org/benchmarks/
Widać, że C zwykle przewyższa Fortran w większości przypadków (ponownie zobacz krytykę poniżej, która również tutaj ma zastosowanie); jak twierdzą inni, analiza porównawcza jest niedokładną nauką, którą można łatwo załadować, aby faworyzować jeden język nad innymi. Ale pokazuje kontekst, w jaki sposób Fortran i C mają podobną wydajność.
źródło
Fortran bardzo wygodnie radzi sobie z tablicą, szczególnie tablicami wielowymiarowymi. Krojenie elementów tablicy wielowymiarowej w Fortranie może być znacznie łatwiejsze niż w C / C ++. C ++ ma teraz biblioteki, które mogą wykonywać to zadanie, takie jak Boost lub Eigen, ale są przecież bibliotekami zewnętrznymi. W Fortranie funkcje te są nieodłączne.
To, czy Fortran jest szybszy czy wygodniejszy w rozwoju, zależy głównie od pracy, którą musisz ukończyć. Jako osoba zajmująca się obliczeniami naukowymi dla geofizyki, większość obliczeń wykonywałem w Fortranie (mam na myśli współczesny Fortran,> = F90).
źródło
Jest to więcej niż nieco subiektywne, ponieważ wpływa na jakość kompilatorów i wiele więcej. Jednak, aby bardziej bezpośrednio odpowiedzieć na twoje pytanie, mówiąc z punktu widzenia języka / kompilatora, w Fortranie nad C nie ma nic, co sprawiłoby, że będzie ono z natury szybsze lub lepsze niż C. Jeśli wykonujesz ciężkie operacje matematyczne, sprowadzi się to do jakość kompilatora, umiejętności programisty w każdym języku oraz wewnętrzne biblioteki obsługi matematyki obsługujące te operacje, aby ostatecznie określić, która będzie szybsza dla danej implementacji.
EDYCJA: Inne osoby, takie jak @Nils, podniosły rację na temat różnicy w użyciu wskaźników w C i możliwości aliasingu, która może spowolnić najbardziej naiwne implementacje w C. Jednak istnieją sposoby, aby sobie z tym poradzić w C99 , poprzez flagi optymalizacji kompilatora i / lub sposób, w jaki napisano C. Jest to dobrze opisane w odpowiedzi na @Nils i kolejnych komentarzach dotyczących jego odpowiedzi.
źródło
Większość postów przedstawia już przekonujące argumenty, więc dodam przysłowiowe 2 centy do innego aspektu.
Bycie fortranem szybciej lub wolniej pod względem mocy obliczeniowej może mieć swoje znaczenie, ale jeśli zajmie to 5 razy więcej czasu, aby opracować coś w Fortranie, ponieważ:
Zatem kwestia nie ma znaczenia. Jeśli coś jest wolne, przez większość czasu nie można go poprawić powyżej określonego limitu. Jeśli chcesz czegoś szybciej, zmień algorytm. W końcu czas na komputery jest tani. Czas ludzki nie jest. Doceń wybór, który skraca czas ludzki. Jeśli wydłuża czas pracy komputera, i tak jest opłacalny.
źródło
I will just add the proverbial 2 cents to a different aspect
Fortran tradycyjnie nie ustawia opcji takich jak -fp: strict (który ifort wymaga włączenia niektórych funkcji w USE IEEE_arithmetic, będącym częścią standardu f2003). Intel C ++ również nie ustawia -fp: strict jako domyślny, ale jest to wymagane na przykład do obsługi ERRNO, a inne kompilatory C ++ nie sprawiają, że wygodne jest wyłączanie ERRNO lub uzyskanie optymalizacji takich jak redukcja SIMD. gcc i g ++ wymagały ode mnie skonfigurowania Makefile, aby uniknąć użycia niebezpiecznej kombinacji -O3 -ffast-matematyka -fopenmp -march = native. Poza tymi zagadnieniami to pytanie dotyczące względnej wydajności staje się bardziej wybredne i zależy od lokalnych zasad dotyczących wyboru kompilatorów i opcji.
źródło