Wydajność F # vs wydajność Erlang, czy istnieje dowód, że maszyna wirtualna Erlang jest szybsza?

19

Poświęciłem czas na naukę programowania funkcjonalnego i doszedłem do części, w której chcę zacząć pisać projekt zamiast po prostu zajmować się samouczkami / przykładami.

Podczas moich badań odkryłem, że Erlang wydaje się być dość potężny, jeśli chodzi o pisanie współbieżnego oprogramowania (co jest moim celem), ale zasoby i narzędzia do programowania nie są tak dojrzałe jak produkty programistyczne Microsoft.

F # może działać na Linuksie (Mono), aby spełnić to wymaganie, ale rozglądając się po Internecie, nie mogę znaleźć żadnych porównań F # z Erlangiem. W tej chwili skłaniam się ku Erlangowi tylko dlatego, że wydaje się, że ma najwięcej prasy, ale jestem ciekawy, czy naprawdę istnieje jakakolwiek różnica w wydajności między tymi dwoma systemami.

Ponieważ jestem przyzwyczajony do programowania w .NET, prawdopodobnie mogę zacząć z F # dużo szybciej niż Erlang, ale nie mogę znaleźć żadnego zasobu, który mógłby mnie przekonać, że F # jest tak samo skalowalny jak Erlang.

Najbardziej interesuje mnie symulacja, która będzie wypuszczać wiele szybko przetwarzanych wiadomości do trwałych węzłów.

Jeśli nie wykonałem dobrej pracy z tym, o co próbuję zapytać, poproś o dalszą weryfikację.

afuzzyllama
źródło
12
Języki nie mają prędkości. Specyficzne implementacje językowe uruchamiające określony program na konkretnym wejściu (może to obejmować cały świat zewnętrzny, w zależności od programu) mają szybkość.
1
F # działa w środowisku uruchomieniowym .NET, a Erlang działa na własnej maszynie wirtualnej. Procesy Erlanga są uważane za lekkie w porównaniu do języków należących do jego domeny (takich jak Scala). Czy w przypadku symulacji spawnowanie węzłów i przekazywanie dużej liczby komunikatów środowisko uruchomieniowe .NET / Mono jest tak samo dobre jak maszyna wirtualna Erlanga, czy też jest lepsza od maszyny wirtualnej Erlanga?
afuzzyllama,
3
@delnan: Języki mają cechy wydajności.
Jon Harrop,
2
@JonHarrop Jak to zrobić? Język programowania to tylko część składni i powiązanej semantyki.
1
@delnan: Semantyka nakłada ograniczenia na optymalizację. Na przykład języki z dynamicznym pisaniem są w praktyce trudne do zoptymalizowania. Brak typów wartości w JVM powoduje o wiele więcej alokacji sterty niż w .NET, aw konsekwencji znacznie większy nacisk na GC. Podobnie jak generatory kodu, śmieciarze mogą wykorzystywać i wykorzystywać takie informacje, jak niezmienność w celu poprawy wydajności. Ogromny wpływ na to ma konstrukcja języka programowania.
Jon Harrop

Odpowiedzi:

21

Co rozumiesz przez „realny”? „Mając najwięcej prasy” niekoniecznie jest najlepszym sposobem na wybór języka.

Twierdzeniem Erlanga do sławy jest jego zdolność do masowej równoległości. Dlatego jest powszechnie stosowany w przełącznikach telefonów Ericsson. Erlang działa w czasie rzeczywistym, dzięki czemu możesz zapewnić pewne gwarancje wydajności.

F # korzysta z możliwości optymalizacji jittera .NET. Ponadto sam język ma być wysoce funkcjonalnym językiem funkcjonalnym (jest odmianą OCaml, szeroko stosowaną w branży finansowej ze względu na szybkość).

Ostatecznie, o ile nie planujesz obsługiwać milionów małych agentów w tym samym czasie (do czego jest zoptymalizowany Erlang), F # powinno być odpowiednie.

Ta strona wyjaśnia odpowiednie przypadki użycia Erlang.

Robert Harvey
źródło
Przez „wykonalne” miałem na myśli skalowalność. Wiem, że prasa nie oznacza, że ​​ten język jest koniecznie lepszy, ale wydaje się, że Erlang został udowodniony (przynajmniej przez Ericsson). Co rozumiesz przez agentów? Procesy?
afuzzyllama,
1
Tak. Udowodniono, że Erlang obsługuje wiele połączeń telefonicznych na przełączniku Ericsson w tym samym czasie. Musisz dowiedzieć się, czy twój przypadek użycia jest podobny. Widzę to jako stosunkowo wyspecjalizowany przypadek użycia; jeśli ta cecha jest nieobecna w twojej aplikacji, nie widzę żadnej korzyści z używania Erlanga, a strona Erlanga faktycznie opisuje niektóre przypadki użycia, dla których Erlang nie jest odpowiedni.
Robert Harvey
2
Agenci, aktorzy, to koncepcja projektowa, która często pojawia się w funkcjonalnych dyskusjach językowych; Dziwię się, że jeszcze na to nie natrafiłeś. en.wikipedia.org/wiki/Agent-based_model
Patrick Hughes
Innymi słowy, czy potrzebujesz ogromnej skalowalności (teraz lub ostatecznie) takiej, jaką zapewnia Erlang? Większość programów nie.
Robert Harvey
1
F # ma również model agenta - używając nieco kryptycznie nazwanej „MailboxProcessor”, co jest tym samym rodzajem rzeczy, co w Erlang. Nie mogę jednak komentować względnej charakterystyki każdego z nich.
FinnNk,
7

Na ten temat można sformułować niewiele obiektywnych stwierdzeń, ponieważ wydajność tych dwóch języków jest silnie uzależniona od stylu aplikacji i programowania.

Jedyną radą, jaką mogę udzielić, jest to, że F # ma przewagę wydajności nad systemem typu statycznego, a CLR wykonuje dobrą robotę, wykorzystując to w celu poprawy wydajności. F # ma asynchronicznych agentów i przekazywanie komunikatów, ale nie został zoptymalizowany, a kod synchroniczny jest często ponad 10 razy szybszy.

Erlang jest dynamicznie typowany, co stawia go w znacznej niekorzystnej sytuacji pod względem wydajności (spodziewaj się dużo więcej boksu), ale został zbudowany od podstaw, aby obsługiwać szybkie przekazywanie wiadomości między agentami asynchronicznymi, więc może być znacznie szybszy niż równoważny F # . Nie mam jednak żadnych wyników testów porównawczych: to tylko moje oczekiwania.

Nawiasem mówiąc, zarówno Erlang, jak i F # są stosunkowo małymi językami z małymi społecznościami, a ze względu na różne rynki docelowe ludzie znający oba są rzadkie. Jedyną osobą, o której mogę pomyśleć, która prawie się kwalifikuje, jest Jesper Louis Andersen, ale nie jestem pewien, ile F # zrobił.

Jon Harrop
źródło
4

Powinieneś przeczytać ten post Joe Armstronga: http://erlang.org/pipermail/erlang-questions/2012-Feb February/ 064277.html

Krótko mówiąc, Erlang nie został zaprojektowany tak, aby był szybki! W wielu przypadkach jest dość szybki, ale ma to drugorzędne znaczenie w kwestiach takich jak odporność na uszkodzenia i stabilność.

Prawda jest taka, że ​​zarówno Erlang, jak i F # są fajnymi językami i chociaż rzuciłem okiem na F #, napisałem książkę o Erlang: Tworzenie aplikacji internetowych z Erlangiem i mogę powiedzieć, że jest to fajny język do pracy.

Chciałbym również zauważyć, że wydaje się, że w funkcjonalnych książkach językowych pojawi się rozkwit w ciągu najbliższych 6-9 miesięcy. Znam co najmniej 4 na Erlangu (w tym mój), jeden na Haskell, a także tytuły na OCaml, Clojure i F #.

Zachary K.
źródło