Niedawno zajmuję się programowaniem funkcjonalnym, zwłaszcza Haskell i F #, jeszcze bardziej. Po pewnym googlowaniu nie mogłem znaleźć porównania porównawczego bardziej znanych języków funkcjonalnych (Scala, F # itp.).
Wiem, że niektóre języki niekoniecznie są sprawiedliwe (przychodzi mi na myśl Scala), ponieważ są to hybrydy, ale chcę tylko wiedzieć, które osiągają lepsze wyniki, niż które z nich.
CPython
vsPyPy
szybko przychodzi mi na myśl.Odpowiedzi:
Zgodnie z Wielkiej Grze poziomy odniesienia , ATS jest szybszy niż reszta z Haskell, Scala, a jeden z wariantów Common Lisp w szorstkiej krawat dla prędkości tuż za to. Potem Ocaml i F # są mniej więcej w tej samej kategorii prędkości, a rakieta i Clojure pozostają w tyle ...
Jednak prawie nic z tego tak naprawdę nic nie znaczy. To wszystko kwestia problemu, maszyny, kompilatora, technik kodowania, a w niektórych przypadkach zwykłego szczęścia. Ogólnie rzecz biorąc, języki kodowane bezpośrednio maszynowo, takie jak Haskell, będą lepsze niż języki skompilowane z VM, takie jak F # i znacznie przewyższą języki czysto interpretowane. Ogólnie mówiąc, języki o typie statycznym są szybsze niż o typie dynamicznym ze względu na analizę statyczną, która pozwala na obliczenie wszystkich operacji typu podczas kompilacji, a nie w czasie wykonywania. Ponownie, są to ogólne zasady, zawsze będą wyjątki. „Paradygmaty” mają z tym niewiele wspólnego.
źródło
Należy również zauważyć, że nie można mierzyć / kwantyfikować wydajności języka programowania . Najlepsze, co możesz zrobić, to zmierzyć wydajność konkretnej implementacji języka na określonych platformach, uruchamiając określone programy.
Kiedy więc pytasz o „najszybszy język funkcjonalny”, tak naprawdę pytasz o najlepsze z obecnych implementacji języka (ów).
Komentarz @ igouy podnosi, że istnieją inne mierniki wydajności implementacji języka; np. czas kompilacji. Ale to nie zmienia faktu, że czas działania aplikacji jest (pośrednią) miarą implementacji języka, a nie miarą samego języka.
Rozważmy na przykład Javę. Załóżmy, że piszę jednowątkowy test porównawczy, używając wyłącznie funkcji językowych klasycznej (Java 1.0) Java. Jeśli skompiluję i uruchomię przy użyciu JDK 1.0, uzyskam niską wydajność ('ponieważ JDK 1.0 nie miał natywnego kompilatora kodu). Jeśli przejdę z JDK 1.1 na ... JDK 1.7, najprawdopodobniej uzyskam stopniowo lepsze wyniki. Ale nie jest to spowodowane zmianami języka Java ... ponieważ mój test porównawczy używa tego samego podzbioru językowego. Raczej przyspieszenie wynika z ulepszeń w kompilatorach, systemie wykonawczym i / lub implementacji bibliotek klas. Są to wszystkie problemy z implementacją .
Drugą kwestią jest to, że różnice w implementacji mogą być naprawdę znaczące (np. Rzędy wielkości) dla tego samego języka. Zatem fakt, że najlepsza implementacja dla języka X jest szybsza niż najlepsza (lub tylko) implementacja języka Y, niekoniecznie mówi wiele o samym języku.
źródło
Jeśli patrzysz na języki tylko na szybkość wykonywania, brakuje niektórych ważnych punktów. Szybkość to dobra rzecz, ale nie tylko.
Haskell korzysta z bardzo solidnego systemu typów do tworzenia programów, które z dużym prawdopodobieństwem będą wolne od błędów i niezawodne.
Erlang wykorzystuje wbudowany system monitorowania, aby umożliwić tworzenie systemów uszkodzeń, które mogą zapewnić ogromny poziom niezawodności w obliczu różnego rodzaju usterek. Ponadto Erlang może zapewnić poziom współbieżności, który trudno jest dopasować w innych językach.
Prawdę mówiąc, uważałbym, że szybkość wykonywania we współczesnych czasach jest raczej daleko na liście rzeczy, które rozważałbym w większości przypadków. (OK, gdybym wykonywał masowe obliczenia numeryczne, prawdopodobnie chciałbym użyć fortranu do prędkości, ale w przeciwnym razie Po prostu nie jest wystarczająco ważny, aby mieć znaczenie)
źródło