Czy Haskell / Clojure faktycznie nie nadaje się do układów dynamicznych, takich jak symulacja cząstek?

9

W poprzednich pytaniach powiedziano mi, że funkcjonalne języki programowania nie są odpowiednie dla systemów dynamicznych, takich jak silnik fizyki, głównie dlatego, że mutowanie obiektów jest kosztowne. Jak realistyczne jest to stwierdzenie i dlaczego?

MaiaVictor
źródło
4
Github.com/linneman/particles-clj może Cię zainteresować. Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases
2
Kto powiedział ci, że są nieodpowiedni? Link do odpowiedzi / komentarza?
Andres F.
7
@Dokkat: Jestem sceptycznie nastawiony do tego, że tam komentator wiele wie o programowaniu funkcjonalnym, szczerze mówiąc. Wziąłbym to z dużym ziarnem soli.
CA McCann
6
Ponadto zignorowałbym również odpowiedź, która zaczyna się od „Czysto funkcjonalne podejście nie jest odpowiednie dla gier ...”, chyba że autor udowodni, że rzeczywiście próbował napisać funkcjonalny program. W przeciwnym razie jest on tylko zgadywać , co myśli problemy mogą być.
Andres F.
1
Rozwój gier @Dokkat ma dodatkowe ograniczenia, a nie tylko symulator cząstek i silnik fizyki (który może dość dobrze pasować do programowania funkcjonalnego) - wydajność w czasie wykonywania jest kluczowa dla rozwoju gry (i czasami ważniejsza niż sama fizyka). Silnik fizyki dla firmy wydobywczej przewidującej wybuchy wymaga dokładności bardziej niż wydajności. Dzięki programowaniu funkcjonalnemu łatwiej jest uzyskać większą wydajność, rzucając na nią więcej sprzętu (coś, czego nie mogą zrobić silniki gier).

Odpowiedzi:

10

Zarówno Haskell, jak i Clojure umożliwiają faktyczną zmienność, więc na początek nie stanowi to problemu.

Poza tym, jeśli twoje „zmienne” dane polegają na stopniowym aktualizowaniu wartości pośrednich w ramach jakiegoś większego obliczenia, być może nawet nie potrzebujesz zmienności, aby była wydajna! Na przykład w Haskell trwają badania nad techniką zwaną fuzją strumieniową , w której kompilator łączy w sobie pętle przetwarzania, producentów danych i odbiorców danych w celu całkowitego wyeliminowania pośrednich struktur danych.

Głównym problemem związanym z Haskellem jest tutaj lenistwo - w programie do łamania liczb, w którym masz dużo danych wejściowych i wiele danych wyjściowych, a wszystko to jest ważne, lenistwo ma bardzo mało przysług, ale wciąż nakłada pewne koszty ogólne. Nie oznacza to, że nie możesz pisać takich programów w Haskell (ludzie to robią), ale nie wykorzystuje to mocnych stron tego języka i musisz lepiej zrozumieć model ewaluacji, aby uzyskać pożądaną wydajność.

To powiedziawszy, ciężkie zgniatanie liczb również nie wpływa na mocne strony JVM. Tego rodzaju program sprawia, że ​​FORTRAN wciąż istnieje.

CA McCann
źródło
1
warto zauważyć: nadchodząca wersja GHC 8.0 będzie obsługiwać tryb ścisłej oceny dla każdego modułu.
Erik Kaplun,
8

Nie mogę mówić w imieniu Clojure, ale mogę powiedzieć, że Haskell ma wiele bardzo dostrojonych pakietów IO, które pozwolą na wszystkie mutacje, których możesz potrzebować.

Oto odpowiedź na pytanie, które napisałem, w którym ktoś wyszczególnia 3 najczęstsze i dotyczy ich wydajności: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Można również zobaczyć tutaj prosty wykres pokazujący wskaźniki wydajności serwera internetowego haskell o nazwie Warp, który jest aplikacją o wysokim stopniu obciążenia.

W przypadku Haskell istnieje wiele nieporozumień. Prawda jest taka, że ​​ma fantastyczne funkcje IO z wieloma pakietami hackage'ów do korzystania z IO na wiele różnych sposobów, z których wiele zostało bardzo zestrojonych. Powodem, dla którego ludzie przypuszczają, że tak nie jest, jest to, że Haskell dokłada wszelkich starań, aby oddzielić IO od wszystkiego innego, ale nie ma to wpływu na charakterystykę wydajności.

Mówiąc teraz o charakterystyce wydajności, powodem, dla którego ludzie uznają ją za słabą, jest leniwa ocena, która powoduje, że zachowuje się ona w sposób niekoniecznie intuicyjny. Jest to jednak coś, o co musisz się martwić znacznie mniej, gdy zaczynasz pracować w kontekście IO, wykonując destrukcyjne aktualizacje, takie jak system, o którym mówisz. Kolejne osoby mają tendencję do stwierdzania, że ​​gdy mają problemy z wydajnością, wbudowane urządzenia do instrumentowania i określania, gdzie idą zasoby, bardzo pomagają.

Kolejną monadą, na którą warto zwrócić uwagę na system, który opisujesz, byłaby monada ST, która jest specjalnie przeznaczona do destrukcyjnych aktualizacji wykonywanych przez bardzo małe wywołania IO, zapewniając jej doskonałą wydajność.

Przepraszam, ale naprawdę nie mogę rozmawiać z Clojure, mam nadzieję, że ktoś inny może podać tam szczegóły.

Jimmy Hoffa
źródło