Fortran zajmuje szczególne miejsce w programowaniu numerycznym. Z pewnością możesz tworzyć dobre i szybkie oprogramowanie w innych językach, ale Fortran nadal działa bardzo dobrze pomimo swojego wieku. Co więcej, łatwiej jest tworzyć szybkie programy w Fortran. Robiłem szybkie programy w C ++, ale musisz bardziej uważać na takie rzeczy, jak aliasing wskaźnika. Musi być więc powód i bardzo techniczny. Czy to dlatego, że kompilator może zoptymalizować więcej? Naprawdę chciałbym poznać szczegóły techniczne, więc jeśli użyję innego języka, mogę wziąć to pod uwagę.
Na przykład wiem - lub myślę - że jedna rzecz jest taka, że standard określa, że wskaźniki są ciągłe w pamięci, co oznacza szybszy dostęp do pamięci. Wierzę, że możesz to zrobić w C ++, podając kompilatorowi flagę. W ten sposób pomaga wiedzieć, co robi Fortran, więc jeśli używamy innego języka, możemy to naśladować.
źródło
Odpowiedzi:
Projektanci języków stają przed wieloma wyborami. Ken Kennedy podkreślił dwa: (1) lepsze abstrakcje i (2) kod wyższego lub niższego poziomu (mniej lub więcej maszynowy). Podczas gdy języki funkcjonalne, takie jak Haskell i Scheme, koncentrują się na tych pierwszych, tradycyjne języki naukowo-komputerowe, takie jak Fortran i C / C ++, koncentrują się na tych pierwszych. Mówienie, że jeden język jest szybszy od drugiego, jest zwykle bardzo mylące: każdy język ma domenę problemową, dla której się wyróżnia. Fortran radzi sobie lepiej w dziedzinie kodów numerycznych opartych na tablicach niż w innych językach z dwóch podstawowych powodów: modelu tablic i jawności.
Model macierzy
Programiści Fortran w dużej mierze wykonują manipulacje tablicowe. W tym celu Fortran ułatwia kilka optymalizacji kompilatora, które nie są dostępne w innych językach. Najlepszym przykładem jest wektoryzacja: znajomość układu danych umożliwia kompilatorowi wywoływanie wewnętrznych elementów na poziomie zestawu w tablicy.
Jawność językowa
Choć wydaje się, że prostszy język powinien się kompilować „lepiej” niż bardziej złożony, tak naprawdę tak nie jest. Kiedy pisze się w języku asemblera , kompilator nie jest w stanie wiele zrobić: widzi tylko bardzo szczegółowe instrukcje. Fortran wymaga jawności (a więc więcej pracy programisty) tylko w przypadkach, które dają realne korzyści dla obliczeń opartych na macierzach. Fortran wykorzystuje proste typy danych, podstawowy przepływ sterowania i ograniczone przestrzenie nazw; z kolei nie informuje komputera, jak ładować rejestry (co może być konieczne w czasie rzeczywistym ). Tam, gdzie Fortran jest jawny, umożliwia takie rzeczy jak pełne wnioskowanie o typie, co pomaga początkującym w rozpoczęciu pracy. Pozwala to również uniknąć jednej rzeczy, która często spowalnia C:nieprzejrzyste wskaźniki .
Fortran może być powolny
Fortran nie jest szybki do każdego zadania: dlatego niewiele osób używa go do tworzenia GUI, a nawet do wysoce nieustrukturyzowanych obliczeń naukowych. Gdy opuścisz świat tablic dla wykresów, drzew decyzyjnych i innych dziedzin, ta przewaga prędkości szybko zanika. Zobacz testy porównawcze języków komputerowych, aby znaleźć przykłady i liczby.
źródło
Konstrukcja Fortran pozwala kompilatorowi na wykonanie silniejszych optymalizacji w niektórych przypadkach, które nie są ogólnie dostępne dla C.
Jednym znanym przykładem jest obsługa aliasingu . W Fortran można uzyskać dostęp do określonego obszaru pamięci tylko przez określony symbol powiązany z tym obszarem pamięci. Ta wiedza umożliwia kompilatorowi stosowanie inteligentnych sztuczek, gdy nadejdzie czas buforowania: wie, czy wartość mogła się zmienić, czy nie. Do F90 było to łatwo weryfikowane. Kiedy wprowadzono Fortran 90
pointers
, założenie nie było już prawdziwe: można było uzyskać dostęp do tego samego obszaru pamięci za pomocą dwóch (lub więcej) symboli. To jest powód, dla którego musisz określićtarget
tablice, które chcesz adresować za pomocą wskaźników.Innym interesującym faktem jest to, że wiele konstrukcji umożliwia kompilatorowi wykonywanie równoległości bez interwencji użytkownika. Taki luksus jest możliwy dzięki względnemu „platformowemu agnostycyzmowi” Fortranu jako języka.
Istnieje wiele innych podobnych sztuczek. Ponadto należy pamiętać, że nikt obecnie nie używa Fortran, z wyjątkiem obliczeń numerycznych, co oznacza, że podstawową cechą i zaletą kompilatorów Fortran jest wynikowa szybkość kodu. W rezultacie dostawcy skupili się na tym.
Niemniej jednak możesz tworzyć kod wykonawczy również w innych językach. Może to jednak wymagać szczególnej opieki lub interwencji człowieka. Ogólna kwestia polega jednak na tym, że wydajność nie stanowi problemu, dopóki nie pojawi się problem, a czas człowieka jest znacznie droższy niż czas komputerowy. Dlatego praktyki kodowania powinny skupiać się na oszczędzaniu czasu ludzkiego, a nie czasu komputerowego.
źródło
Nie sądzę, aby Fortran był tak blisko metalu (zobacz inną odpowiedź), ale ma tendencję do bardzo łatwej optymalizacji. Pętle są proste, a język z łatwością obsługuje rozszerzenia wektoryzacji (okej, kiedy użyłem go w mojej pierwszej pracy, celowaliśmy w szeroki zakres wektorów dużych żelaza).
Istnieje również duży czynnik bezwładności. Wiele kodów numerycznych znajduje się w Fortran, więc twórcy wysokiej klasy serwerów i superkomputerów upewniają się, że piszą dobre optymalizujące kompilatory Fortran. Kompilatory są dobre (nawet na komputerach ze względnie brakiem wysokiej jakości kompilatorów), więc użytkownicy nadal korzystają z Fortran, a nawet piszą w nim nowy kod. Konstruktorzy upewniają się, że ich następna generacja ma dobre kompilatory itp.
źródło
Uważaj tutaj na miejskie mity. Jeśli dwa kompilatory wygenerują ten sam kod zestawu, wówczas powstałe programy będą miały tę samą wydajność.
Dla dowolnej logiki istnieje program w języku asemblera, który minimalizuje czas jego wykonywania. Ten program nie dba o to, który kompilator go wygenerował.
To powiedziawszy, istnieją skompilowane języki, aby ułatwić życie programistom. Część tego kosztuje to, że mogą skusić użytkownika do korzystania z funkcji, które nie skutkują minimalnym czasem wykonania. Najlepszym tego przykładem jest
new
C ++. (Jak wolno to może być - to tylko trzy postacie?) Praktycznie prosi cię o dynamiczne przydzielanie pamięci i nie zwracanie uwagi na koszt środowiska wykonawczego. Jeśli to właśnie chcesz zrobić, to wspaniale, ale Fortran może być szybszy tylko dlatego, że nie wciągnęło cię w to.Ale poza tym nigdy nie widziałem programu, który, jak napisano po raz pierwszy, nie miał większego miejsca na poprawę wydajności w rodzaju, którego kompilator nigdy nie mógłby dla ciebie wyczyścić. Jako jeden przykład, spędzanie dużej części czasu na telefonowaniu
exp
i / lublog
powtarzaniu z tym samym argumentem. Jako kolejny przykład, wywoływanie DGEMM w celu pomnożenia macierzy i stwierdzenie, że duża część czasu zajmuje wywołanie LSAME tylko po to, aby rozszyfrować argumenty znaków wejściowych.Jest to w tym samym czasie, gdy ludzie mówią, że Fortran jest szybszy z powodu aliasingu wskaźnika lub rozwijania pętli. To tak, jakby powiedzieć, że autobus wyprodukowany przez Porsche byłby z pewnością szybszy niż autobus wyprodukowany przez Chevroleta. Trzeba trochę zdrowego rozsądku.
źródło